以下编译:
static int foo() { return 1; }
int foo();
但是,它会一直编译吗?这种情况下的行为是否定义得很好?当非静态原型遵循静态声明时它意味着什么?
答案 0 :(得分:15)
是的,它将编译并且行为定义明确。由于foo
早于static
1 宣布int foo();
,foo
具有内部链接。
对于在该标识符的先前声明可见的范围内使用存储类说明符
extern
声明的标识符, 31) 如果先前声明指定内部或外部链接,后面声明中标识符的链接与先前声明中指定的链接相同。 [...]
脚注说明:
31)如6.2.1中所述,后面的声明可能隐藏先前的声明。
<子> <强> 1 即可。如果未指定存储类,则假定该函数具有外部链接。标准说:如果函数的标识符声明没有存储类说明符,则其链接
确切地确定它是使用存储类说明符extern
- 6.2.2(p5)声明的。
答案 1 :(得分:0)
默认情况下,功能是全局的。所以制作它
static int foo() { return 1; }
函数foo()
只在此文件中可见。由于您只有声明int foo();
,如果您对同一int foo(){ return 2;}
有一个定义,那么这很好并且定义良好,那么您将获得重新定义错误。
如 @haccks
所述6.2.1,后面的声明可能会隐藏先前的声明。
注意声明和定义之间的区别。