Что происходит, когда объявление нестатической функции следует декларации статической функции?

Следующие компиляции:

static int foo() { return 1; }
int foo();

Но будет ли он всегда компилироваться? Является ли поведение в этом случае хорошо определенным? И что это значит, когда нестатический прототип следует статическому объявлению?

+17
01 февр. '15 в 16:21
источник поделиться
2 ответа

Да, он будет компилироваться, а поведение корректно определено. Поскольку foo объявлен static раньше int foo(); 1foo имеет внутреннюю связь.

C11: 6.2.2 Связывание идентификаторов (p4):

Идентификатор, объявленный с помощью спецификатора класса хранения extern в области, в которой видна предварительная декларация этого идентификатора, 31), если предыдущее объявление указывает внутренние или внешние привязка, идентификатор идентификатора в последующем объявлении совпадает с привязкой, указанной в предыдущем объявлении. [...]

и нога отмечает, что:

31) Как указано в 6.2.1, более поздняя декларация может скрыть предыдущее объявление.


<суб > 1. Если класс хранения не указан, предполагается, что функция имеет внешнюю связь. Стандарт говорит: если декларация идентификатора для функции не имеет спецификатора класса хранения, ее привязка определяется так, как если бы он был объявлен с помощью спецификатора класса хранения extern - 6.2.2 (p5).

+15
01 февр. '15 в 16:24
источник

По умолчанию функции являются глобальными. Итак, сделав это

static int foo() { return 1; }

Функция foo() видна только в этом файле. Поскольку у вас просто есть объявление int foo();, это хорошо и четко определено, если у вас есть определение для того же int foo(){ return 2;}, после чего вы получите ошибку переопределения.

Как указано @haccks

6.2.1, более поздняя декларация может скрыть предыдущее объявление.

Обратите внимание на разницу между объявлением и определением.

0
01 февр. '15 в 16:53
источник

Посмотрите другие вопросы по меткам или Задайте вопрос