下面的编译很好,仅在函数声明期间使用static
:
#include <stdio.h>
static int a();
int a(){
return 5;
}
int main(){
printf("%d\n", a());
return 0;
}
作为附带说明,inline
函数会发生与上述相同的行为,即,只有声明可以具有关键字。
但是以下操作失败,但对变量执行相同操作:
#include <stdio.h>
static int a;
int a = 5;
int main(){
printf("%d\n", a);
return 0;
}
获取thew错误:non-static declaration of 'a' follows static declaration
。
有什么区别?
C标准中的此引用显示了区别)6.2.2标识符的链接)
5如果函数标识符的声明没有 存储类说明符,它的链接被确定为完全一样 用存储类说明符extern声明。如果 对象标识符的声明具有文件范围并且没有 存储类说明符,其链接是外部的。
因此,函数看起来好像具有隐式存储说明符extern
(但这并不意味着它具有与对象标识符相反的外部链接,在这种情况下,该对象标识符具有外部链接)。
现在根据下面的引用
4 对于使用存储类说明符extern声明的标识符 在该标识符的先前声明为 可见的31)如果先前声明指定内部还是外部 链接,在以后的声明中标识符的链接是 与先前声明中指定的链接相同。如果没有先前声明 声明可见,或者如果先前的声明未指定 链接,则标识符具有外部链接
因此该函数具有内部链接。
然后是变量的标识符
7如果在翻译单元中,相同的标识符出现在两个 内部和外部链接,行为是不确定的。
以上引述的简历如下。如果函数没有明确指定的存储类说明符extern
,则其链接由先前的函数声明(如果存在这样的声明)确定。至于对象的标识符,则在这种情况下具有外部链接。并且,如果预先声明了带有内部链接的标识符,则该行为是不确定的。