0

C++コンパイラがどのシンボルを定義または未定義にするかを正確に決定する方法を見つけるのに少し苦労しています。つまり、変数/関数が定義済みまたは未定義のシンボルにコンパイルされるかどうかを、C++ ソース コードでどのように知ることができるかということです。最初に、定義された変数/関数はすべて定義されたシンボルになると思っていましたが、そうではないようです。static、extern、inlineなどのキーワードも考慮して、これを正確に判断する方法はありますか?

*update 問題は、C++ での定義と宣言に関するものではなく、私のコードがコンパイルされるかどうかでもありません。現在、C++ ソースでのみ宣言されている一部の関数/変数は、コードをコンパイルして nm でオブジェクト ファイルを調べると、定義済みのシンボルになると思います。この情報が必要です: 定義済み/宣言済みの C++ 関数/変数は、オブジェクト ファイル (ELF など) に定義済み/未定義のシンボルにコンパイルする方法を教えてください。

4

2 に答える 2

0

foo.cppをfoo.oにコンパイルすると、foo.cppで定義された特定のシンボルがfoo.oに存在し、他のシンボルは「インライン化」されます。これがあなたの言いたいことであると仮定すると、これはコンパイラ固有であり、実装によって定義されていることがわかります。たとえば、インライン関数に対するGCCの動作に関する興味深い議論があります。

http://gcc.gnu.org/onlinedocs/gcc/Inline.html

于 2012-05-08T15:59:45.340 に答える
0

宣言するだけで変数/関数を定義しない場合、それは定義されません。

// In global/namespace scope
int i; // defined
extern int ei; // not defined
extern int eid = 42; // assignment causes it to be defined

void foo(); // not defined
void bar() { } // defined
于 2012-05-08T13:10:23.283 に答える