2017-05-27 8 views
7

मैं विकल्प सी ++ 14 के साथ the code संकलन करने की कोशिश की:<algorithm> एक मैक्रो एक्स परिभाषित करता है?

#define X static_cast<double>(2) 
#include <algorithm> 
// if you change the two lines, no error occurs 

int main() 
{ 
    return 0; 
} 

लेकिन मैं एक्स के बाद त्रुटि मिलती है:

error: expected ',' or '...'

मैं विकल्प सी ++ 98 के साथ त्रुटि नहीं मिलता है। मेरे जीसीसी संस्करण 4.8.4 के साथ, मुझे त्रुटि नहीं मिलती है, लेकिन 5.4.0 के साथ मैं करता हूं। क्या यह एक बग है? क्या मैं कुछ गलत करता हूँ?

+0

प्रदान किए गए कोड के साथ gcc6 – vsoftco

+0

[पुन: उत्पन्न नहीं कर सकता] (https://godbolt.org/g/Xv0ksm) के साथ कोई त्रुटि नहीं है। इस बात के लिए कि मैक्रो को परिभाषित करता है, आप दस्तावेज़ीकरण की जांच कर सकते हैं - ऐसा नहीं है। – DeiDei

+0

यही कारण है कि मैंने लिंक प्रदान किया। यदि यह एक बग है, तो प्रदाता से जुड़े प्रभावित संस्करणों का उपयोग कर सकते हैं। तो @ डीईडी, क्या यह एक बग है और मैंने सबकुछ ठीक किया? यदि ऐसा है, तो कृपया इसे स्वीकार करने का उत्तर दें। – DanielTuzes

उत्तर

8

मुझे अपने स्थानीय जी ++ 5.4.0 स्थापना पर एक ही त्रुटि मिलती है। मैं g++ -E उत्पादन को देखा, और यह लाइनों 252 और 254 /usr/lib/gcc/x86_64-linux-gnu/5/include/ia32intrin.h करने के लिए त्रुटि निशान लगता है:

/* Write flags register */ 
extern __inline void 
__attribute__((__gnu_inline__, __always_inline__, __artificial__)) 
__writeeflags (unsigned long long X) // 252 
{ 
    __builtin_ia32_writeeflags_u64 (X); // 254 
} 

यह माना जा सकता है कंपाइलर-बंडल लाइब्रेरी में एक बग, क्योंकि गैर-आरक्षित #define एस उनके साथ संघर्ष नहीं करना चाहिए। (एक ही शीर्षलेख में अन्य फ़ंक्शंस पैरामीटर __X का उपयोग करें।)

+2

यही कारण है कि प्रीप्रोसेसर बुरा है। – DeiDei

+0

यह एक बग है। मानक पुस्तकालय को इस मुद्दे के कारण आरक्षित लोगों को छोड़कर किसी भी पहचानकर्ता का उपयोग नहीं करना चाहिए। स्टीफन टी। लावेवज ने एक बार एसटीएल कार्यान्वयन में लम्बाई के बारे में एक भावुक एकान्त दिया, यह सुनिश्चित करने के लिए कि यह सभी कोने मामलों में काम करता है (वे मानते हैं कि उपयोगकर्ता बुरा हैं और मानक के भीतर अनुमति देने वाली हर अजीब चीज करेंगे; वे गलत नहीं हैं) । उपयोगकर्ता परिभाषित मैक्रोज़ से निपटने में आसान है (केवल एक्स जैसे नामों का उपयोग न करें); अधिभारित ऑपरेटरों के साथ उपयोगकर्ता परिभाषित प्रकार अधिक दर्द डालते हैं। –

+0

यह एक दिलचस्प सवाल उठाता है। क्या ऐसे उपयोगकर्ता-परिभाषित मैक्रो मुद्दों से मेरे _own_ शीर्षकों की सुरक्षा करने का कोई तरीका है? –

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