Ответ 1
Нет. Объявление функции (прототип или даже определение) может опустить ключевое слово static
, если оно приходит после другого объявления той же функции с static
.
Если есть одно объявление static
функции, его первое объявление должно быть static
.
Он определен в ISO/IEC 9899: 1999, 6.7.1:
Если объявление идентификатора области файла для [...] функции содержит спецификатор класса хранения
static
, идентификатор имеет внутреннюю привязку.[...]
Для идентификатора, объявленного с помощью спецификатора класса хранения
extern
в области видимости, в которой видна предварительная декларация этого идентификатора, если предыдущее объявление указывает внутреннюю или внешнюю связь, связь идентификатора с последующим объявлением так же, как и ссылка, указанная в предыдущем объявлении.[...]
Если декларация идентификатора для функции не имеет спецификатора класса хранения, ее привязка определяется точно так, как если бы она была объявлена с помощью спецификатора класса хранения
extern
.[...]
Если в пределах единицы перевода появляется тот же самый идентификатор с внутренней и внешней связью, поведение undefined.
Так, например, это действительно:
static void foo(void);
void foo(void);
static void foo(void) { }
Этот тоже:
static void foo(void) { }
void foo(void);
static void bar(void);
void bar(void) {}
Но этот код неверен:
void foo(void);
static void foo(void) { }
Обычно вы также должны иметь и static
в прототипах (потому что они обычно на первом месте).