![](/img/trans.png)
[英]Is static keyword necessary both in functions' prototype and definition in C?
[英]Does a static function need the static keyword for the prototype in C?
我的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
(因为它们通常是第一个)。
是的,是的,你确实需要在声明面前放置静态。
输入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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.