№ Объявление функции (прототип или даже определение) может опустить ключевое слово static
, если оно приходит после другого объявления той же функции с static
.
Если есть одна заявка функции static
, ее первая декларация должна быть static
.
Он определен в стандарте ISO/IEC 9899: 1999, 6.7.1:
Если декларация идентификатора области видимости файла для [...] функция содержит хранения класса спецификатор static
, то идентификатор имеет внутреннюю связь.
[...]
Для получения идентификатора объявленного с хранением класса спецификатором extern
в объеме, в котором перед декларацией этого идентификатора видна, если предшествующая декларация определяет внутреннюю или внешнюю связь, подчеркивалась связь идентификатора в более позднем объявлении совпадает с ссылкой, указанной в предыдущем объявлении.
[...]
Если объявление идентификатора для функции не имеет хранения класса спецификатор, его связи определяется точно так, как если бы она была объявлена с хранением класса спецификатор extern
.
[...]
Если в единице трансляции, тот же самый идентификатор появляется с внутренней и внешней связи, поведение не определено.
Так, например,это справедливо:
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
в прототипы тоже (потому что они обычно на первом месте).
Вы пытались скомпилировать 'void foo(); static void foo() {} '? – 2013-03-27 21:38:05
Это один из тех, почему бы вам не попробовать что-то вроде этого. Простота проверки. –
Не перед компьютером, я могу сейчас скомпилировать .. Кроме того, я заметил, что в программировании, просто потому, что он работает в одном примере, не означает, что он будет работать во всех * случаях. – w1res