Подтвердить что ты не робот

Требуется ли статической функции статическое ключевое слово для прототипа в C?

В моей книге программирования C написано, что когда я хочу создать статическую функцию, мне нужно поставить статическое ключевое слово перед определением функции. В нем ничего конкретно не говорится о прототипе. Кроме того, примеры не используют прототипы и просто ставят статические функции в верхней части файла (так что им не нужны прототипы, которые я предполагаю).

Итак, нужна ли статической функции статическое ключевое слово для прототипа? Или я только ставил его перед определением?

4b9b3361

Ответ 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 в прототипах (потому что они обычно на первом месте).

Ответ 2

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

введите это в ideone.com

int add();
int main(){
    printf("%d",add());
    return 0;
}

static int add(){
    return 1+1;
}

вы получите этот результат: http://ideone.com/VzZCiE

теперь введите этот

static int add();
int main(){
    printf("%d",add());
    return 0;
}

static int add(){
    return 1+1;
}

вы получите следующее: http://ideone.com/sz8HVR

boooom