Ниже приведены два отдельных кода, записанных в двух отдельных файлах Test1.c и Test2.c. Я не использую ключевое слово 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
зависит от компилятора?
extern
для обмена переменными между исходными файлами на C? а> - person Jonathan Leffler   schedule 12.01.2017-fno-common
. - person Sourav Ghosh   schedule 12.01.2017extern
, а не-extern
, которое рассматривается в другом вопросе. То, что вы видите, - это одна из распространенных моделей поведения. Это санкционировано стандартом как расширение, но оно не строго соответствует букве стандарта (Приложение J является «информативным», а не «нормативным»). То, что делает GCC, рассматривается в повторяющемся вопросе без вызова GCC по имени. Если вы найдете других людей, которые повторно откроют вопрос, я не буду его оспаривать, но я думаю, что это справедливое дублирующее решение. - person Jonathan Leffler   schedule 12.01.2017