繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM