Пусть программа состоит из 3х файлов:
//file1.c
#include <stdio.h>
int x;
void f1()
{
printf("in f1 x= %d\n", x);
}
//file2.c
#include <stdio.h>
int x;
void f2()
{
printf("in f2 x= %d\n", x);
}
//main.c
void f1();
void f2();
int x = 3;
int main()
{
f1();
f2();
}
Как я понимаю, в соответсвии со стандартом, переменные, объявленные в начале файла, обладают внутренним связыванием (internal linkage). То есть этот код компилироваться не должен. Чтобы было правильно, нужно ставить перед int x слово extern, а ровно в одном .c файле должно встретиться определение int x. Но gcc данный код спокойно компилирует, даже с -Wall -Wpedantic . Значение x печатается в обоих случаях 3.
Это какая-то особенность gcc? Или я что-то не так понял в определении связывания?