Yerel değişkenleri dışlamak için hangi bağlantıların verildiğini kontrol ederken,
derleyiciler arasında bazı farklı davranışların olduğunu gördüm.
Örneğin
, yorum değişkeninde gördüğünüz kodun altında test edersem değişkenin var
farklı bağlantıları vardır.
// 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;
}
}
}
sonuç
- g ++: "100 10 10"
- clang ++: "100100100" (msvc ++)
Sonuçtan görebiliyorum ki ikiden fazla iç içe blok varsa,
g ++ sadece değişkenlere dış bağlantılar sağlar
Standartta ilgili ifadeyi bulabilirim
ama davranışları derleyiciler tarafından farklı olduğu için hala belirsiz
( https://eel.is/c++draft/basic.link#6 )
İngilizcemin kötü olduğundan korkuyorum, doğru bir şekilde
anlayamıyorum Birisi hangi derleyicilerin standarda iyi uyduğuna dair bir fikre
sahipse ve mümkünse biri standardın tam olarak benim için söylediklerini ayrıntılandırabilir mi?
f()
işlevi ile örnek verir ve en içtekiextern void f()
iç bağlantı vardır -var
aynı "varlık" anlamına gelir, çünkü burada da iç bağlantı olmalıdır.