以下编译良好,使用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;
}
出现错误:non-static declaration of 'a' follows static declaration
.
有什么区别呢?
来自 C 标准的引用显示了差异)6.2.2 标识符的链接)
5 如果函数的标识符声明没有
存储类说明符,它的链接完全就像它一样确定
使用存储类说明符 extern 进行声明。如果
对象标识符的声明具有文件范围,但没有
存储类说明符,其链接是外部的。
所以一个函数看起来有隐式存储说明符extern
(但这并不意味着它具有与对象标识符相反的外部链接,在本例中对象标识符具有外部链接)。
现在根据以下引用
4 对于使用存储类说明符 extern 声明的标识符
在该标识符的先前声明的范围内
可见,31) 如果先前声明指定内部或外部
链接,后面声明时标识符的链接是
与先前声明中指定的链接相同。如果没有事先
声明是可见的,或者如果之前的声明指定不可见
链接,则该标识符具有外部链接
因此,由于该函数的初始声明带有存储说明符 static,因此该函数具有内部链接。
至于变量的标识符
7 如果在一个翻译单元内,相同的标识符出现在两个
内部和外部链接,行为未定义。
上述引用的简历如下。如果函数没有明确指定的存储类说明符extern
那么它的链接由先前的函数声明确定(如果存在这样的声明)。至于对象的标识符,那么在这种情况下它具有外部链接。如果事先声明了具有内部链接的标识符,则行为是未定义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)