Рассмотрим программу C, состоящую из двух файлов,
f1.c:
int x;
f2.c:
int x=2;
Мое чтение пункта 6.9.2 стандарта C99 заключается в том, что эта программа должна быть отклонена. В моей интерпретации 6.9.2 переменная x
условно определена в f1.c
, но это предварительное определение становится фактическим определением в конце единицы перевода и, на мой взгляд, должно вести себя так, как будто f1.c
содержало определение int x=0;
.
Со всеми компиляторами (и, что важнее, линкерами) я смог попробовать, это не то, что происходит. Все платформы компиляции, которые я пробовал, связывают два вышеуказанных файла, а значение x
равно 2 в обоих файлах.
Я сомневаюсь, что это происходит случайно, или просто как "простая" функция, предоставляемая в дополнение к тому, что требует стандарт. Если вы думаете об этом, это означает, что в компоновщике есть особая поддержка для тех глобальных переменных, которые не имеют инициализатора, в отличие от тех, которые явно инициализированы до нуля. Кто-то сказал мне, что функция компоновщика может понадобиться для компиляции Fortran. Это было бы разумным объяснением.
Любые мысли об этом? Другие толкования стандарта? Имена платформ, на которых файлы f1.c
и f2.c
отказываются связываться вместе?
Примечание: это важно, потому что вопрос возникает в контексте статического анализа. Если два файла могут отказаться от привязки на какой-либо платформе, анализатор должен жаловаться, но если каждая платформа компиляции принимает его, тогда нет никаких оснований предупреждать об этом.