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

时间:2013-03-27 21:37:10

标签: c static-functions

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

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

2 个答案:

答案 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