2012-01-18 11 views
1

私は理論的な質問があります。ここで静的関数のextern宣言は内部リンケージを中断しますか?

は例です:

FILE1.C

static void foo() 
{ 
    ... 
} 

file2.c

extern void foo(); 

main() 
{ 
    foo(); 
} 

コンパイルがOKです。

したがって、externは静的宣言の内部リンケージを解除しますか?

+0

あなたにはどんな驚きがありますか?コンパイラは一度に1つのコンパイル単位で動作します。リンカーはおそらく文句を言うでしょう。 –

+0

また、 'main'が正しくありません。任意の数のパラメータを受け入れることができます。 –

+0

また、プログラムをリンクしてみましたか? – nos

答えて

4

「コンパイルOK」は理論上のみですか、それとも実際にテストしましたか?

static機能は、それが中だとコンパイル単位(Cファイル、典型的には)外部から見えてはならない。

異なるコンパイル単位でexternと同じ名前の関数を宣言すると、これを変更してはなりません。

そうでない場合、あなたがテストしていることすべてはあなたが外部のシンボルへの「ぶら下がり」参照(2.Cから参照foo機能)を持つことができるということであるから、あなたが本当に適切にテストプログラムを構築し、リンクていることを確認します。ビルド2.cを実行可能ファイルにリンクすることは失敗します。

0

コンパイルは正常です。リンクすることもできれば、コンパイラに問題があります。

0

簡単なテストは、期待リンカの障害(VC++ 2010 Expressを)確認:

1> TEST.OBJ:エラーLNK2019:未解決の外部シンボル "無効__cdeclのfoo(無効)"(?FOO @@ YAXXZ)は、参照関数内_wmain

関連する問題