我的 C 编程书上说,当我想创建一个静态函数时,我需要将 static 关键字放在函数定义前面。它没有明确提及原型的任何内容。此外,这些示例不使用原型,只是将静态函数放在文件的顶部(因此它们不需要我假设的原型)。
那么,静态函数是否需要原型的 static 关键字?还是我只把它放在定义前面?
我的 C 编程书上说,当我想创建一个静态函数时,我需要将 static 关键字放在函数定义前面。它没有明确提及原型的任何内容。此外,这些示例不使用原型,只是将静态函数放在文件的顶部(因此它们不需要我假设的原型)。
那么,静态函数是否需要原型的 static 关键字?还是我只把它放在定义前面?
不可以。如果函数声明(原型甚至定义)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
在原型中使用(因为它们通常首先出现)。
是的,是的,您确实需要将 static 放在声明的前面。
将此输入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
呸呸呸