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

17 c static function linkage

以下编译:

static int foo() { return 1; }
int foo();
Run Code Online (Sandbox Code Playgroud)

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

hac*_*cks 14

是的,它将编译并且行为定义明确.由于早于1foo宣布,具有内部联系. staticint foo();foo

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

对于使用该标识符extern的先前声明可见的作用域中的存储类说明符声明的标识符,31) 如果先前声明指定内部或外部链接,则后面声明中的标识符的链接与在先前声明中指定的联系.[...]

脚注说:

31)如6.2.1中所述,后面的声明可能隐藏先前的声明.


1.如果未指定存储类,则假定该函数具有外部链接.标准说:如果函数的标识符声明没有存储类说明符,则确定其链接与使用存储类说明符extern- 6.2.2(p5)声明的完全相同.

  • 但是,我的原型是用`extern`定义的. (3认同)