静态函数是否需要C中原型的static关键字?

w1r*_*res 43 c static-functions

我的C编程书说当我想创建一个静态函数时,我需要将static关键字放在函数定义的前面.它没有明确提及原型.此外,这些示例不使用原型,只是将静态函数放在文件的顶部(这样它们就不需要我假设的原型).

那么,静态函数是否需要原型的static关键字?或者我把它放在定义的前面?

und*_*gor 46

不可以.函数声明(原型甚至定义)可以省略关键字,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) { }
Run Code Online (Sandbox Code Playgroud)

这个也是:

static void foo(void) { }
void foo(void);

static void bar(void);
void bar(void) {}
Run Code Online (Sandbox Code Playgroud)

但是这段代码不正确:

void foo(void);
static void foo(void) { }
Run Code Online (Sandbox Code Playgroud)

通常情况下,您也应该拥有static原型(因为它们通常是第一个).

  • +1:和提醒:函数定义作为原型; 原型作为声明. (3认同)