कुछ पृष्ठभूमि: यदि मैं के लिए,, scanf()
उपयोग करने के लिए उदाहरण के लिए, एक मानक पूर्णांक प्रकार में एक स्ट्रिंग में कनवर्ट करने uint16_t
की तरह चाहता था, मैं SCNu16
<inttypes.h>
से इस तरह का उपयोग करेंगे,:एक स्ट्रिंग को एक असामान्य पूर्णांक प्रकार में पोर्टेबल रूप से कैसे परिवर्तित करें?
#include <stdio.h>
#include <inttypes.h>
uint16_t x;
char *xs = "17";
sscanf(xs, "%" SCNu16, &x);
लेकिन एक और अधिक असामान्य पूर्णांक प्रकार जैसे pid_t
में ऐसी कोई चीज़ नहीं है; केवल सामान्य पूर्णांक प्रकार <inttypes.h>
द्वारा समर्थित हैं। अन्य तरीके से बदलने के लिए, करने के लिए portably एक pid_t
printf()
, मैं इसे intmax_t
पर कास्ट कर सकते और PRIdMAX
उपयोग करते हैं, इस तरह:
#include <stdio.h>
#include <inttypes.h>
#include <sys/types.h>
pid_t x = 17;
printf("%" PRIdMAX, (intmax_t)x);
हालांकि, वहाँ के लिए portably scanf()
एक pid_t
में एक तरह से होना करने के लिए प्रतीत नहीं होता। तो यह मेरा सवाल है: यह पोर्टेबल कैसे करें?
#include <stdio.h>
#include <sys/types.h>
pid_t x;
char *xs = 17;
sscanf(xs, "%u", &x); /* Not portable! pid_t might not be int! /*
मैं एक intmax_t
को ing और उसके बाद यह जांच करना कि मूल्य pid_t
को कास्टिंग से पहले pid_t
की सीमा के भीतर है scanf()
के बारे में सोचा है, लेकिन वहाँ एक रास्ता अधिकतम या pid_t
के लिए न्यूनतम मूल्यों को प्राप्त करने के लिए प्रतीत नहीं होता ।
मैंने सुना है कि अगले POSIX मानक केवल एक intmax_t में फिट करने के लिए इसे की आवश्यकता होगी, इसलिए का उपयोग कर लंबे समय से बाहर है। मैंने वास्तव में जो किया वह जीएनयू सी लाइब्रेरी के दस्तावेज़ों पर निर्भर था कि pid_t हमेशा int होगा, और टिप्पणी कर रहा है। कोड वैसे भी अन्य glibc- विशिष्ट सामान का उपयोग करता है, इसलिए यह एक वास्तविक समस्या नहीं है। – Teddy
मुझे एक गैर-पोर्टेबल धारणा (कोड में जो पहले स्थान पर पोर्टेबल नहीं था) का उपयोग करके पहले से ही "व्यावहारिक रूप से पर्याप्त" समाधान प्राप्त हुआ है। जो कुछ मैं चाहता था वह वास्तव में पोर्टेबल समाधान था, अगर ऐसी चीज वास्तव में मौजूद है। – Teddy