CHAR_WIDTH अघोषित है


9

‘CHAR_WIDTH’ undeclared जब मैं इस सरल कार्यक्रम को संकलित करने का प्रयास करता हूं तो मुझे त्रुटि मिलती है :

#include <stdio.h>
#include <limits.h>

int main()
{
  printf("CHAR_BIT = %d\n", CHAR_BIT);
  printf("CHAR_WIDTH = %d\n", CHAR_WIDTH);
  return (0);
}

साथ में

gcc ./show_char_width.c -o show_char_width

और gcc: GNU C17 (Ubuntu 8.3.0-6ubuntu1) संस्करण 8.3.0 (x86_64-linux-gnu) GNU C संस्करण 8.3.0, GMP संस्करण 6.1.2, MPFR संस्करण 4.0.2, MPF संस्करण 1.1.0 द्वारा संकलित , isl संस्करण isl-0.20-GMP, कर्नेल: 5.0.0-37-जेनेरिक।

जैसा कि यहाँ कहा गया है CHAR_WIDTH को सीमा में परिभाषित किया जाना चाहिए। यह मेरे कार्यक्रम में शामिल है। तो मुझे यह त्रुटि क्यों मिली?

-vविकल्प के साथ मैंने पाया कि पुस्तकालय उन निर्देशिकाओं में खोजा जाएगा:

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/8/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/8/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include

/ usr / lib / gcc / x86_64-linux-gnu / 8 / शामिल-फिक्स्ड में एक सीमाएँ होती हैं। इनमें syslimits.h शामिल होता है, जो उसी dir से होता है, जिसमें अगली सीमाएँ शामिल होती हैं ।h, कि आपकी समझ से स्थित होना चाहिए / usr / निर्देशिका शामिल है।

CHAR_WIDTH मैक्रो वास्तव में उन फ़ाइलों में परिभाषित है, लेकिन कुछ शर्तों के तहत जो मेरे वास्तविक ज्ञान से अधिक है।

मैंने अब तक जिन स्थितियों को पाया, वे हैं:


/* The integer width macros are not defined by GCC's <limits.h> before
   GCC 7, or if _GNU_SOURCE rather than
   __STDC_WANT_IEC_60559_BFP_EXT__ is used to enable this feature.  */
#if __GLIBC_USE (IEC_60559_BFP_EXT)
# ifndef CHAR_WIDTH
#  define CHAR_WIDTH 8
# endif

तथा :

#ifdef __STDC_WANT_IEC_60559_BFP_EXT__
/* TS 18661-1 widths of integer types.  */
# undef CHAR_WIDTH
# define CHAR_WIDTH __SCHAR_WIDTH__

इसलिए मुझे आपकी मदद चाहिए।

नोट: मुझे A.5.1 में वर्णित अन्य सभी मैक्रोज़ के साथ एक ही त्रुटि मिलती है: SCHAR_WIDTH, INT_WIDTH, LONG_WIDTH, आदि।


किस तरह की शर्तें?
एलपीएस

1
@ एलपी: शायद कुछ ऐसा है जो ओपी को समझ में नहीं आता है -> " मेरे वास्तविक ज्ञान से अधिक है। "
एल्क

2
एडिट के बाद। __STDC_WANT_IEC_60559_BFP_EXT__कमांड लाइन द्वारा इसे परिभाषित या पास करना
LPs

1
FWIW, POSIX को CHAR_BIT8 होना चाहिए, जिसका मतलब CHAR_WIDTHPOSIX सिस्टम पर 8 होना चाहिए।
एंड्रयू हेनले

4
@pliski आपने #defineपहले किया था #include?
लीजेंडोफेड्रो

जवाबों:


5

CHAR_WIDTHमानक नहीं है, न ही कोई अन्य *_WIDTHमैक्रोज़ हैं, लेकिन एक चरित्र प्रकार की चौड़ाई CHAR_BITवैसे भी होनी चाहिए *।

*_WIDTHसामान्य रूप से मैक्रोज़ के लिए , उन्हें कड़ाई से ज़रूरत नहीं है क्योंकि वे संबंधित अहस्ताक्षरित प्रकार के अधिकतम मूल्य से संकलित-समय-संगणनीय हैं, अर्थात, आप #define WIDTH_FROM_UNSIGNED_MAX(UnsignedMax)एक पूर्णांक स्थिर अभिव्यक्ति में विस्तार कर सकते हैं जो प्रीप्रोसेसरी कंडीशन में भी उपयोग करने योग्य है ( #if), हालांकि कार्यान्वयन थोड़ा अस्पष्ट है (देखें कि संकलन-समय पर पूर्णांक प्रकार की चौड़ाई की गणना करने का कोई तरीका है? ), उदाहरण के लिए:

#define WIDTH_FROM_UNSIGNED_MAX(UnsignedMax) POW2_MINUS1_BITS_2039(UnsignedMax)
/* Number of bits in inttype_MAX, or in any (1<<k)-1 where 0 <= k < 2040 */
#define POW2_MINUS1_BITS_2039(X) ((X)/((X)%255+1) / 255%255*8 + 7-86/((X)%255+12))

//compile-time test it, assuming uint{8,16,32,64}_t exist
#include <inttypes.h>
#if WIDTH_FROM_UNSIGNED_MAX(UINT8_MAX) != 8
    #error
#endif
#if WIDTH_FROM_UNSIGNED_MAX(UINT16_MAX) != 16
    #error
#endif
#if WIDTH_FROM_UNSIGNED_MAX(UINT32_MAX) != 32
    #error
#endif
#if WIDTH_FROM_UNSIGNED_MAX(UINT64_MAX) != 64
    #error
#endif

कुछ लोग बस करते हैं CHAR_BIT * sizeof(integer_type), लेकिन यह कड़ाई से पोर्टेबल नहीं है , क्योंकि यह मानता integer_typeहै कि इसमें पैडिंग बिट्स नहीं हैं (यह आमतौर पर ऐसा नहीं होता है लेकिन सैद्धांतिक रूप से यह उनके पास हो सकता है), और #ifसशर्त या तो इसका उपयोग नहीं कर सकता है ।


* दुर्भाग्य से, इस जानकारी को चमकाने के लिए, आपको मानक से अधिक कूदने की आवश्यकता है:

पूर्णांक प्रकार की चौड़ाई (अप्रत्यक्ष रूप से) इसकी गैर-बिट बिट्स की संख्या के रूप में परिभाषित होती है ( 6.2.6.2p6) ) ।

6.2.6.2p2 का कहना signed charहै कि कोई पैडिंग बिट्स नहीं है। क्योंकि पूर्णांक को C ( 6.2.6.2p2 ) में कैसे दर्शाया जा सकता है , इसका तात्पर्य यह है कि unsigned charया तो कोई पैडिंग बिट्स नहीं हो सकता है, और चूंकि समान मान होने के दौरान या ( 5.2.4.2.1p2 ) charकी समान सीमा होनी चाहिए ( अर्थात् 1, 6.5.3.4p4 ), एक सादे किसी भी गद्दी बिट्स या तो नहीं हो सकता है, और इसलिए == की चौड़ाई ( | | )signed charunsigned charsizeofcharCHAR_BIT charsigned charunsigned char

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.