2013-09-05 4 views
9

जीसीसी 4.7.2 के साथ यह मेरे लिए ठीक संकलित:_ (सिंगल अंडरस्कोर) एक मान्य सी ++ परिवर्तनीय नाम है?

int main() 
{ 
    int _ = 1; 
    return 0; 
} 

मैं यह सामान्य रूप में संकलित करने के लिए उम्मीद कर सकते हैं? मैंने answers about underscores as prefixes पढ़ा है। लेकिन क्या होगा अगर अंडरस्कोर कुछ भी उपसर्ग नहीं कर रहा है?

उत्तर

11

एक नाम (पहचान) में अक्षरों और अंकों का अनुक्रम होता है। फास्ट वर्ण एक पत्र होना चाहिए। अंडरस्कोर चरित्र, _, एक पत्र माना जाता है।

सी ++ प्रोग्रामिंग भाषा, चौथा संस्करण से।

+4

आप उस उद्धरण से अनुमान लगा सकते हैं कि उत्तर "हां" है, लेकिन ऐसा कहना अच्छा होगा। –

11

स्ट्राउस्ट्रुप (तीसरा संस्करण, धारा 4.9.3) के अनुसार, एक पहचानकर्ता में अक्षरों और अंकों का अनुक्रम होता है। पहला चरित्र एक पत्र होना चाहिए। अंडरस्कोर चरित्र को एक पत्र माना जाता है।

तो, हाँ, यह पोर्टेबल होना चाहिए।

+2

आपको 2 सेकंड तक मारो! –

+0

इसके अलावा, [सी ++ मानक] में (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf) (2.11)। – nickie

3

हां। एक _ को चर या किसी पहचानकर्ता/नामस्थान नाम के रूप में स्वीकार किया जाएगा! जैसे google mock इसका उपयोग करता है।

+0

बूस्ट.एमपीएल भी। http://www.boost.org/doc/libs/1_54_0/libs/mpl/doc/refmanual/placeholders।एचटीएमएल –

0

हाँ यह एक वैध उपसर्ग है।

#include <iostream> 

using namespace std; 

int main() 
{ 
char* _ = "Hello World"; 
cout << _ << endl; 
return 0; 
} 

प्रिंट समाप्त होने वाले हैं "नमस्ते दुनिया" के रूप में उम्मीद। यह एक बहुत ही उपयोगी विविध नाम नहीं है लेकिन यह मान्य है

+3

संकलन या इसे चलाने से मानक-अनुपालन या पोर्टेबिलिटी सुनिश्चित नहीं होती है। –

+1

@WayneMcGee: जब तक आपके पास या तो कंप्यूटर्स के बहुत सारे तक पहुंच नहीं है [हालांकि जब यह विपरीत होना चाहिए तो कुछ संकलक में विफल या सफल होने की संभावना है), या संकलक को मानकों के बारे में सख्त होने के लिए कहें [और फिर, सख्तता विषय हो सकती है कंपाइलर कीड़े के लिए]। –

7

हां, _ एक वैध पहचानकर्ता है, क्योंकि यह वाक्यविन्यास आवश्यकताओं को पूरा करता है। असल में, एक पहचानकर्ता में अंडरस्कोर या अक्षर होता है, उसके बाद शून्य या अधिक वर्ण होते हैं जो अंडरस्कोर, अक्षरों या अंक हो सकते हैं। (सी ++ 2011 के अनुसार, पहचानकर्ताओं में सार्वभौमिक चरित्र नाम और अन्य कार्यान्वयन-परिभाषित वर्ण भी हो सकते हैं, लेकिन यह आपके प्रश्न के लिए प्रासंगिक नहीं है।)

लेकिन शायद यह नहीं है कि आपको अपने कोड में उपयोग करना चाहिए, जब तक कि आप ' बहुत सावधान रहना

this answer के रूप में कहते हैं, 2003 सी ++ मानक उद्धृत:

प्रत्येक ऐसा नाम है जो एक अंडरस्कोर के साथ शुरू होता ग्लोबल नेम स्पेस में एक नाम के रूप में उपयोग के लिए कार्यान्वयन के लिए आरक्षित है।

आपका _ चर वैश्विक नामस्थान में नहीं है, तो आप इस मामले में सुरक्षित हैं, लेकिन यह एक अच्छा विचार किसी भी एक अंडरस्कोर के साथ शुरू पहचानकर्ता को परिभाषित करने से बचने के लिए है।

इसके अलावा, मुझे विश्वास है कि जीएनयू गेटटेक्स्ट (जो स्थानीयकृत संदेशों के लिए समर्थन प्रदान करता है) अपने उद्देश्यों के लिए _ नाम का उपयोग करता है। (यह तर्कसंगत रूप से जीएनयू गेटटेक्स्ट के लिए एक बुरा विचार था, लेकिन यह एक सुविधाजनक विकल्प था।)

+0

क्या यह (जीएनयू गेटटेक्स्ट सम्मेलन) सी ++ नामकरण नियमों के साथ संघर्ष नहीं करता है? मैंने पढ़ा है कि अंडरस्कोर के साथ * वैश्विक * वर्जन * वर्जित हैं? – Wolf

+1

@ भेड़िया: वे बिल्कुल * वर्जित * नहीं हैं, लेकिन वे आरक्षित हैं। हां, मेरा मानना ​​है कि गेटटेक्स्ट का उपयोग '_' दोनों सी और सी ++ आवश्यकताओं का उल्लंघन करता है - लेकिन जब तक कार्यान्वयन वास्तव में' _' का उपयोग नहीं करता है, तो वास्तविक समस्याएं होने की संभावना नहीं है। –

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