Ниже приведены два отдельных кода, записанных в двух отдельных файлах Test1.c и Test2.c. Я не использую ключевое слово extern
в любом файле.Почему GCC компилирует и связывает два файла, даже если «extern» не используется?
//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++;
}
Я составил этот код с помощью GCC:
gcc Test1.c Test2.c
Он генерирует следующий вывод:
test1 - a val = 1
test2 - a val = 1
Я пытался печатать адрес переменной a
в обоих кодов. Адрес также тот же.
Теперь я следующие вопросы:
- ли
gcc
автоматически компилировать и ссылку даже еслиextern
не используется ?? Здесь, видимо,gcc
внутренне делает это, поскольку я компилирую эти два файла вместе. - Это поведение с/без
extern
ключевое слово зависит от компилятора?
Это не строго соответствует C. Это «общее расширение», задокументированное в Приложении J стандарта. См. Также раздел «Не так хороший способ определить глобальные переменные» в [Как использовать «extern» для обмена переменными между исходными файлами в C?] (Http://stackoverflow.com/questions/1433204/) –
Скомпилировать с '-fno-common'. –
@JonathanLeffler Как это может быть дубликат этого вопроса?Мой вопрос касался поведения extern с gcc-компилятором. –