Это вызвано запутанными терминами. file scope
в C не означает ограничение привязки идентификатора только к одной единице перевода. Это также не означает, что область действия ограничена одним физическим файлом. Вместо этого file scope
означает, что ваш идентификатор является глобальным. Термин file
здесь относится к тексту, являющемуся результатом обработки всех #include
, #define
и других директив препроцессора.
В общем, сфера действия - это только концепция, действующая в пределах одной единицы перевода. Когда задействовано несколько компиляций, начинает происходить связывание.
Если вы объявляете переменную области видимости файла static
, тогда она дает переменную внутреннюю связь, что означает, что она не видна за пределами этой единицы перевода.
Если вы не объявите это статически явно, или если вы объявите переменную области файла extern
, то это будет видно другим единицам перевода: те, если они объявят переменную области файла с тем же идентификатором, будут иметь этот идентификатор ссылку на эту же переменную.
В вашем случае включение bar.c
в foo.c
вставляет определение fileScopeVariable
в компилируемую единицу перевода. Таким образом, это видно в этом блоке.