विभिन्न ब्लॉकों में समान नामित बाहरी चर को c ++ में संकलक के बीच अलग-अलग संबंध क्यों मिलते हैं?


12

जब मैं सिर्फ जाँच कर रहा था कि कौन से लिंकेज बाहरी वैरिएबल्स को दिए गए हैं तो
मैंने पाया कि कंपाइलरों के बीच कुछ अलग व्यवहार है

उदाहरण के लिए अगर मैंने नीचे दिए गए कोड का परीक्षण किया
जैसा कि आप टिप्पणियों में देखते हैं कि चर के varअलग-अलग लिंक हैं

// foo.cpp
int var = 10;                // external linkage

// main.cpp
#include <iostream>

static int var = 100;        // internal linkage

int main() {
    extern int var;          // internal linkage
    std::cout << var << std::endl;
    {
        extern int var;      // g++: external linkage , clang++: internal linkage
        std::cout << var << std::endl;
        {
            extern int var;  // g++: external linkage , clang++: internal linkage
            std::cout << var << std::endl;
        }
    }
}       

परिणाम है

  • जी ++: "100 10 10"
  • clang ++: "100 100 100" (msvc ++)

मैं परिणाम से देख सकता हूं कि अगर दो से अधिक नेस्टेड ब्लॉक
जी ++ हैं तो बस चर के लिए बाहरी लिंक को अनुदान देता है

मैं मानक में संबंधित वाक्यांश पा सकता हूं
लेकिन यह अभी भी स्पष्ट नहीं है क्योंकि इसका व्यवहार संकलक
( https://eel.is/c++draft/basic.link#6 ) द्वारा अलग है

मुझे डर है कि मेरी अंग्रेजी खराब है, इसलिए मैं इसे सही तरीके से प्राप्त नहीं कर सकता हूं।
अगर किसी को यह विचार है कि कौन से कंपाइलर मानक अच्छी तरह से अनुरूप हैं
और यदि संभव हो तो क्या कोई यह बता सकता है कि मानक मेरे लिए वास्तव में क्या कहता है?


1
संबंधित stackoverflow.com/questions/41978949/… मेरा मानना ​​है कि यह एक जीसी बग है, मानक f()फ़ंक्शन के साथ उदाहरण देता है और अंतरतम extern void f()में आंतरिक संबंध है - varयहां भी आंतरिक संबंध होना चाहिए, क्योंकि यह उसी "इकाई" को संदर्भित करता है।
कामिलुक

IMO बाहरी लिंकेज के साथ संस्थाओं के दायरे घोषणाओं ब्लॉक बुराई कर रहे हैं और भाषा उन पर प्रतिबंध लगाने के साथ बेहतर बंद हो जाएगा
एम.एम.

@MM: मॉड्यूल इकाइयां ऐसा करती हैं!
डेविस हेरिंग

जवाबों:


4

यह खुला मुद्दा CWG1839 का विषय है । वर्तमान मंशा यह है कि क्लैंग और एमएसवीसी का व्यवहार सही है।

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