1

staticキーワードが C 関数/変数をファイル スコープにすることは知っています。そして、変数のグローバルスコープ(複数のファイルからアクセスされる)を作成したい場合は、次のようにする必要があることを読みました。

.cファイル内:

int my_global_var;

// main()....

.hファイル内:

extern int my_global_var;

したがって、私のファイルを含める人は誰でも、すでに編集されているもの.hを参照できます。my_global_varextern

gccまた、これは関数にも必要ですが、 4.xを使用していexternて、.hファイルに関数がなく、他のプログラムが正常に機能することも読みましlinkた。

それで、質問は...

非静的関数リンケージの動作はデフォルトですか、それともextern非静的関数は標準に準拠する必要がありますか??

4

2 に答える 2

2

標準より、6.2.2

5関数の識別子の宣言にストレージ クラス指定子がない場合、そのリンケージは、ストレージ クラス指定子 extern で宣言された場合とまったく同じように決定されます。オブジェクトの識別子の宣言にファイル スコープがあり、ストレージ クラス指定子がない場合、そのリンケージは外部です。

つまり、デフォルトでは extern です。

于 2011-02-23T17:05:20.137 に答える
1

デフォルトでは、関数宣言とオブジェクト宣言の両方がありexternます。ただし、再定義を回避するには、ヘッダーファイルのオブジェクト宣言に明示を追加する必要がありexternます。ストレージクラス指定子がないと、ファイルスコープのオブジェクト宣言は実際には暫定定義と呼ばれるものになり、内のオブジェクトのストレージを予約します。現在の翻訳単位。

一貫性を保つためexternに、関数宣言にも不必要に使用しています。ほとんどの場合、ヘッダー内のオブジェクトを次の1つとして宣言します。

extern int foo;
static const int bar = 42;

の1つとして機能します

extern int spam(void);
static inline int eggs(void) { return 42; }
于 2011-02-23T17:09:09.137 に答える