次の2つのコードは、Test1.cとTest2.cの2つのファイルに分かれています。どんなファイルでもextern
キーワードを使用していません。 GCCを使用してこのコードをコンパイルなぜ、externが使われなくても、GCCは2つのファイルをコンパイルしてリンクするのですか?
//Test1.c
#include <stdio.h>
int a = 1;
int main()
{
printf("test1 - a val = %d\n",a);
fn();
printf("After Return : %d",a);
}
//Test2.c
#include <stdio.h>
int a;
int fn()
{
printf("test2 - a val = %d\n",a);
a++;
}
I:これは以下の出力を生成
gcc Test1.c Test2.c
:
test1 - a val = 1
test2 - a val = 1
Iは、両方のコードに可変a
のアドレスを印刷しようとしました。アドレスも同じです。
は、今、私が質問に次き:
gcc
は自動的extern
が使用されていない場合でも、コンパイルとリンクしません?ここでは明らかにgcc
が内部的にこの2つのファイルをまとめています。- この動作は/なしで
extern
キーワードはコンパイラに依存しますか?
厳密に準拠していません。これは、標準の附属書Jに記載されている「共通の拡張子」です。 [C言語でソースファイル間で変数を共有するために 'extern'を使うにはどうすればいいですか?]のセクション 'グローバル変数を定義するには良い方法ではありません'を参照してください。(http://stackoverflow.com/questions/1433204/) –
'-fno-common'オプションです。 –
@JonathanLefflerこれはどのようにその質問と重複することができますか?私の質問はgccコンパイラでexternの動作に関するものでした。 –