extern int a = 10; // it is not giving error
int main()
{
extern int b = 10; //it is giving error
return 0;
}
エラー: 'b'に 'extern'とイニシャライザの両方があります。 extern int b = 10;なぜextern int a;初期化ではローカルにエラーが発生しますが、
extern int a = 10; // it is not giving error
int main()
{
extern int b = 10; //it is giving error
return 0;
}
エラー: 'b'に 'extern'とイニシャライザの両方があります。 extern int b = 10;なぜextern int a;初期化ではローカルにエラーが発生しますが、
C11(N1570)6.7.9/5 初期を参照:
If the declaration of an identifier has block scope, and the identifier has external or internal linkage, the declaration shall have no initializer for the identifier.
ルールは、制約部内に配置されるので、任意の適合コンパイラは、それに違反するコードを、拒否すべきです。
ブロックスコープでのextern
キーワードのポイントは、になります。スコープの外にある既存のオブジェクトを宣言します。オブジェクトを宣言し、宣言の時点で他の値を与えることは、あまり意味がありません。
外部オブジェクトを宣言するための推奨される方法は、宣言をファイルスコープ(ソースコードの最上部)に置くことです。メンテナンスプログラマーが容易に見つけて管理することができます。
externキーワードは何ですか? –
@Artur Hmmm ...関数内でextern宣言が可能で、グローバルなオブジェクト(外部リンケージあり!)を他の場所で定義していると思います。例:ローカル関数宣言のために。私は初期化することはできないと思いますが、これは*定義*の時点でのみ可能です。つまり、メモリが割り当てられる場所です。 –
@ Garf365正しいですが、これはC++です。これはCです。私たちはCデュプリを得ることができますか? :) –