我是中级C程序员。我正在浏览C
中的简单代码片段int a ; // A
const int b; // B
static int c; //C
void func(int d) // D
{
//.....
}
变量a,b,c和d的联系是什么。我确信a
默认情况下具有外部链接,b
,c
和d
具有内部链接。我的理解是否正确?
这是我在这个网站的第一个问题。
答案 0 :(得分:6)
来自C99的6.2.2, Linkages of identifiers
部分,权威来源:
1 /在不同范围或同一范围内多次声明的标识符可以是 通过称为链接的过程来引用相同的对象或函数。有 三种联系:外部,内部和无。
2 /在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明表示相同的对象或功能。在一个翻译单元内,具有内部链接的标识符的每个声明表示相同的对象或功能。没有链接的标识符的每个声明都表示一个唯一的实体。
3 /如果对象或函数的文件范围标识符的声明包含静态的存储类说明符,则标识符具有内部链接。
4 /对于在范围内使用存储类说明符extern声明的标识符,其中该标识符的先前声明是可见的,如果先前声明指定内部或外部链接,则后面声明中的标识符的链接是与先前声明中指定的联系相同。如果没有先前声明可见,或者先前声明未指定链接,则标识符具有外部链接。
5 /如果函数的标识符声明没有存储类说明符,则确定其链接与使用存储类说明符extern声明的链接完全相同。如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的。
6 /以下标识符没有链接:声明为对象或函数以外的任何标识符;声明为函数参数的标识符;没有存储类说明符extern声明的对象的块作用域标识符。
7 /如果在翻译单元中,同一标识符同时出现内部和外部链接,则行为未定义。
现在,逐个处理变量:
a
由第5部分涵盖,因为它是“具有文件范围且没有存储类说明符的对象的标识符”。因此它具有外部联系。b
也包含在第5部分(文件范围,没有存储类说明符)中。因此外部联系。c
由第3部分涵盖,因为它具有static
存储类说明符 - 它具有内部链接。d
由第6部分涵盖,是一个函数参数 - 它没有链接。答案 1 :(得分:4)
在C中,a
和b
具有外部链接,c
具有内部链接。在C ++中,你是对的,b
也有内部联系。
对于案例“D”,我不确定你在说什么:函数或参数。 func
有外部联系; d
没有联系。
答案 2 :(得分:3)
我确信默认情况下,外部链接
b
,c
和d
具有内部链接。我的理解是否正确?
没有! d
没有联系,因为它是一个形式参数。
来自C99
以下标识符无链接:声明为对象或函数以外的任何标识符; 声明为函数参数的标识符;没有存储类说明符extern声明的对象的块作用域标识符。
此外b
在C99中有外部联系。在C ++中,文件范围内的const限定变量具有内部链接。
答案 3 :(得分:-2)
a,b和c都具有相同的链接,如果它们在全局范围内声明它看起来像是
d是一个函数参数,在调用该函数时创建,在函数返回时不再存在