Ответ 1
Да, он будет компилироваться, а поведение корректно определено. Поскольку foo
объявлен static
раньше int foo();
1foo
имеет внутреннюю связь.
C11: 6.2.2 Связывание идентификаторов (p4):
Идентификатор, объявленный с помощью спецификатора класса хранения
extern
в области, в которой видна предварительная декларация этого идентификатора, 31), если предыдущее объявление указывает внутренние или внешние привязка, идентификатор идентификатора в последующем объявлении совпадает с привязкой, указанной в предыдущем объявлении. [...]
и нога отмечает, что:
31) Как указано в 6.2.1, более поздняя декларация может скрыть предыдущее объявление.
<суб > 1. Если класс хранения не указан, предполагается, что функция имеет внешнюю связь. Стандарт говорит: если декларация идентификатора для функции не имеет спецификатора класса хранения, ее привязка
определяется так, как если бы он был объявлен с помощью спецификатора класса хранения extern
- 6.2.2 (p5).