我的C编程书说当我想创建一个静态函数时,我需要将static关键字放在函数 definition 的前面。它没有明确提及原型。此外,这些示例不使用原型,只是将静态函数放在文件的顶部(这样它们就不需要我假设的原型)。
那么,静态函数是否需要原型的static关键字?或者我仅将放在定义的前面?
答案 0 :(得分:42)
没有。函数声明(原型甚至定义)可以省略关键字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
(因为它们通常是第一个)。
答案 1 :(得分:-1)
是的,是的,你确实需要在声明面前放置静态。
将其输入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