जब मैं सिर्फ जाँच कर रहा था कि कौन से लिंकेज बाहरी वैरिएबल्स को दिए गए हैं तो
मैंने पाया कि कंपाइलरों के बीच कुछ अलग व्यवहार है
उदाहरण के लिए अगर मैंने नीचे दिए गए कोड का परीक्षण किया
जैसा कि आप टिप्पणियों में देखते हैं कि चर के 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 ) द्वारा अलग है
मुझे डर है कि मेरी अंग्रेजी खराब है, इसलिए मैं इसे सही तरीके से प्राप्त नहीं कर सकता हूं।
अगर किसी को यह विचार है कि कौन से कंपाइलर मानक अच्छी तरह से अनुरूप हैं
और यदि संभव हो तो क्या कोई यह बता सकता है कि मानक मेरे लिए वास्तव में क्या कहता है?
f()
फ़ंक्शन के साथ उदाहरण देता है और अंतरतमextern void f()
में आंतरिक संबंध है -var
यहां भी आंतरिक संबंध होना चाहिए, क्योंकि यह उसी "इकाई" को संदर्भित करता है।