2012-04-13 31 views
9

gccのソースファイルを参照していました。 gcc.cでは、私はextern宣言と関数定義が同じファイル内にあります

extern int main (int, char **); 

int 
main (int argc, char **argv) 
{ 

のようなものが今、私の疑問はexternで見られる特定の関数は、このファイルではありませんが、プロジェクトのどこか発見されるコンパイラに伝えることです。しかしここではmainの定義はextern宣言の直後です。その後、extern宣言はどのような目的で使用されますか?

この具体例では、externたちが組み立てに使うexportのように動作しているようだ、のような私たちは、モジュールの外で特定のシンボルをエクスポートwherinそれは

、任意のアイデアですか?

答えて

13

あなたはexternを誤解している - それは定義がに別のファイルであるコンパイラに伝えるないを行い、それは単にそれを定義せずに存在することを宣言します。 と同じファイルで定義することは大丈夫です。

Cには、宣言(宣言して何かが存在すると宣言している)と定義(実際に存在させる)という概念があります。 と何度も何度も宣言できますが、一度しか定義できません。

関数にはデフォルトで外部リンケージが設定されているため、externキーワードはこの場合は無関係です。

0

警告は、関数のプロトタイプが欠落している可能性があります。それで全部です。

6

関数は暗黙的にCのexternです。externを含むことは、ビジュアルリマインダです。サイドノート、extern以外の機能を作成するにはstaticキーワードを使用できます。

+0

である。非標準的なことをするときはexternを使います。 – Barry

0

main関数の定義:

int main(int argc, char **argv) { ... } 

は、宣言は、外部結合を持つ機能mainの試作構文で既に。これは、mainの定義の直前にexternというプロトタイプの宣言が冗長であることを意味します。

2

関数宣言では、externは、関数が外部リンケージを持つことを単純に宣言します。これはデフォルトです。この文脈ではexternキーワードはまったく役に立たず、効果はexternキーワードのない通常の宣言/プロトタイプと同じです。

関連する問題