我是中级 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
具有内部链接。我的理解正确吗?
这是我在这个网站上的第一个问题。
来自6.2.2, Linkages of identifiers
C99 的部分,权威来源:
1/ 在不同范围内或在同一范围内多次声明的标识符可以通过称为链接的过程来引用同一对象或函数。有三种联系方式:外部、内部和无。
2/ 在构成整个程序的一组翻译单元和库中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。在一个翻译单元中,具有内部链接的标识符的每个声明都表示相同的对象或函数。没有链接的标识符的每个声明都表示一个唯一的实体。
3/ 如果对象或函数的文件范围标识符的声明包含存储类说明符 static,则该标识符具有内部链接。
4/ 对于使用存储类说明符 extern 声明的标识符,在该标识符的先前声明可见的范围内,如果先前声明指定内部或外部链接,则后面声明的标识符的链接与先前声明中指定的链接。如果前面的声明不可见,或者前面的声明没有指定链接,则标识符具有外部链接。
5/ 如果函数标识符的声明没有存储类说明符,则其链接被确定为就好像它是使用存储类说明符 extern 声明的一样。如果对象标识符的声明具有文件范围且没有存储类说明符,则其链接是外部的。
6/ 以下标识符没有链接: 声明为除对象或函数之外的任何东西的标识符;声明为函数参数的标识符;没有存储类说明符 extern 声明的对象的块范围标识符。
7/ 如果在翻译单元中,相同的标识符同时出现在内部和外部链接中,则行为未定义。
现在,一一处理你的变量:
a
由第 5 部分介绍,因为它是“具有文件范围且没有存储类说明符的对象的标识符”。因此,它具有外部联系。b
也包含在第 5 部分(文件范围,无存储类说明符)中。因此,外部链接。c
由第 3 部分介绍,因为它具有static
存储类说明符 - 它具有内部链接。d
由第 6 部分介绍,作为函数参数 - 它没有链接。在 C 中,a
有b
外部链接,c
也有内部链接。在 C++ 中你是对的,那b
也有内部链接。
对于案例“D”,我不确定您在谈论哪个:函数或参数。func
有外部联系;d
没有联系。
我很确定 a 默认情况下具有外部链接
b
,c
并且d
具有内部链接。我的理解正确吗?
不!d
没有链接,因为它是一个形式参数。
从 C99
以下标识符没有链接: 声明为对象或函数以外的任何标识符;声明为函数参数的标识符;没有存储类说明符 extern 声明的对象的块范围标识符。
此外b
,在 C99 中有外部链接。在文件范围内的 C++ const 限定变量具有内部链接。
a,b 和 c 都具有相同的链接,如果它们是在全局范围内声明的,看起来它们是
d 是函数参数,在调用该函数时创建,在函数返回时不再存在