58

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

那么,静态函数是否需要原型的 static 关键字?还是我把它放在定义前面?

4

2 回答 2

62

不可以。如果函数声明(原型甚至定义)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在原型中使用(因为它们通常首先出现)。

于 2013-03-27T21:55:07.747 回答
0

是的,是的,您确实需要将 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

呸呸呸

于 2013-03-27T21:38:43.533 回答