externローカル変数
にどのリンケージが許可されているかを確認しているだけですが、コンパイラ間でいくつかの異なる動作があることがわかりました
たとえば
、コメント変数で見られるように、以下のコードをテストした場合、変数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;
}
}
}
結果は
- g ++: "100 10 10"
- clang ++: "100 100 100"(msvc ++)
結果から、ネストされたブロックが3つ以上ある場合、
g ++は変数への外部リンケージを付与するだけであることがわかります
標準で関連するフレーズを見つけることができました
が、コンパイラによって動作が異なるため、依然として不明です
(https://eel.is/c++draft/basic.link#6)
英語が下手なため、正しく
理解できないのではない
でしょうか。どのコンパイラが標準によく準拠していて、可能であれば、標準が私に正確に言っていることを誰かが詳しく説明できる人がいる場合はどうすればよいですか。
外部リンケージを持つエンティティのIMOブロックスコープ宣言は悪であり、言語はそれらを禁止する方がよいでしょう
—
MM
@MM:モジュールユニットはそうします!
—
Davis Herring
f()
機能を備えた例を示し、最も内側extern void f()
に内部リンケージがあります-var
同じ「エンティティ」を参照するため、ここにも内部リンケージがあるはずです