当非静态函数声明遵循静态函数声明时会发生什么?

时间:2015-02-01 16:21:30

标签: c function static linkage

以下编译:

static int foo() { return 1; }
int foo();

但是,它会一直编译吗?这种情况下的行为是否定义得很好?当非静态原型遵循静态声明时它意味着什么?

2 个答案:

答案 0 :(得分:15)

是的,它将编译并且行为定义明确。由于foo早于static 1 宣布int foo();foo具有内部链接。

C11:6.2.2标识符的链接(p4):

  

对于在该标识符的先前声明可见的范围内使用存储类说明符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,后面的声明可能会隐藏先前的声明。

注意声明和定义之间的区别。