2012-07-04 4 views
12

इस c कार्यक्रम मेंक्या यह #if के लिए अपरिभाषित प्रतीकात्मक स्थिरांक 0 के रूप में मानने के लिए मानक है?

#include<stdio.h> 
int main() 
{ 

     #if UnDefinedSymbolicConstant==0 
       printf("UnDefinedSymbolicConstant is equal to 0\n "); 
     #else 
       printf("UnDefinedSymbolicConstant is not equal to 0\n"); 

     #endif 
     return 0; 
} 

UnDefinedSymbolicConstant#define कहीं भी नहीं किया गया है, अभी भी यह के रूप में ग्रहण किया जा रहा है और output on gcc-4.3.4 के रूप में देता है: इस

UnDefinedSymbolicConstant is equal to 0 

हां, तो है मानक व्यवहार या यह केवल जीसीसी में इस तरह काम करता है?

+0

यह पता लगाने का एक अच्छा तरीका है कि कुछ मानक है या नहीं है -std = c99 -pedantic। यह सभी जीसीसी एक्सटेंशन अक्षम करना चाहिए। उनके बिना, जीसीसी मानक के बजाय अच्छी तरह से अनुरूप है। – Lundin

+2

क्या आप सुनिश्चित हैं कि '-std = c99 -pedantic' सभी गैर मानक संरचनाओं को पकड़ता है? ऐसा लगता है कि, लेकिन अगर मैं गलत नहीं हूं, तो यह अभी भी कुछ याद करता है। असल में आप '-std = c99' पर भरोसा कर सकते हैं, उन चीजों को अनुमति देने से बचें जो मानक-निर्दिष्ट व्यवहार के साथ संघर्ष करते हैं, लेकिन यह आपको उन चीजों को करने से नहीं रोकता है जो संघर्ष नहीं करते हैं लेकिन इन्हें निर्दिष्ट नहीं किया जाता है मानक। '-pedantic' का इरादा आपको बाद के बारे में चेतावनी देना है, लेकिन मुझे पूरा विश्वास नहीं है कि यह पूरा हो गया है। –

उत्तर

13

हाँ, यह 6.10.1 में मानक द्वारा निर्दिष्ट किया जाता:

बाद मैक्रो विस्तार और परिभाषित एकल ऑपरेटर के कारण सभी प्रतिस्थापन प्रदर्शन किया गया है, सभी शेष पहचानकर्ता (lexically कीवर्ड के समान उन सहित) को पीपी-नंबर 0

6

यह डिफ़ॉल्ट है, लेकिन आप कम से कम -Wundef विकल्प जीसीसी के लिए चेतावनी उत्पन्न कर सकते हैं।

`-Wundef ': चेतावनी दें जब भी एक पहचानकर्ता जो किसी मैक्रो में एक` #if का सामना करना पड़ा है नहीं' के बाहर के निर्देश, `परिभाषित '। ऐसे पहचानकर्ता शून्य के साथ प्रतिस्थापित हैं।

संबंधित मुद्दे

 संबंधित मुद्दे