C语言中的链接混淆问题

4

我是一名中级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具有内部链接性。我的理解是正确的吗?
这是我在该网站上的第一个问题。
4个回答

6
从C99的第6.2.2节“标识符的关联性”中,可以得知以下内容:
1. 同一作用域内或不同作用域内声明的标识符可以通过关联过程引用相同的对象或函数。有三种类型的关联:外部、内部和无。 2. 在组成整个程序的翻译单元和库集合中,具有外部关联的特定标识符的每个声明表示相同的对象或函数。在一个翻译单元中,具有内部关联的标识符的每个声明表示相同的对象或函数。没有关联的标识符的每个声明表示唯一的实体。 3. 如果文件作用域标识符的声明包含存储类别说明符static,则该标识符具有内部关联。 4. 对于在先前声明可见的作用域中使用存储类别说明符extern声明的标识符,如果先前声明指定了内部或外部关联,则后续声明中标识符的关联与先前声明中指定的关联相同。如果没有先前声明可见,或者先前声明未指定关联,则该标识符具有外部关联。 5. 如果函数的标识符声明没有存储类别说明符,则其关联性的确定方式与使用存储类别说明符extern声明时完全相同。如果对象的标识符具有文件作用域且没有存储类别说明符,则其关联性为外部。 6. 以下标识符没有关联:声明为对象或函数以外的任何内容的标识符;声明为函数参数的标识符;未使用存储类别说明符extern声明的对象的块作用域标识符。 7. 如果在一个翻译单元中,同一标识符具有内部和外部关联,则行为未定义。
现在逐个解释您的变量:
1. 变量a由第5部分涵盖,因为它是“具有文件作用域且没有存储类别说明符”的对象的标识符。因此具有外部关联。 2. 变量b也由第5部分涵盖(文件作用域,无存储类别说明符)。因此具有外部关联。 3. 变量c由第3部分涵盖,因为它具有static存储类别说明符-具有内部关联。 4. 最后,变量d由第6部分涵盖,作为函数参数-没有关联。

1
对于那些想要了解链接是什么,以及为什么规则是什么样子的人,我写了这篇博客文章:http://norswap.com/c_scope_duration_linkage/ - Norswap

4
在C语言中,ab具有外部链接性,而c具有内部链接性。在C++中,你是正确的,b也将具有内部链接性。
对于情况"D",我不确定您所说的是函数还是参数。 func具有外部链接性;d没有链接性。

3
我很确定一个默认情况下具有外部链接性,b、c和d具有内部链接性。我的理解正确吗?
不!d没有链接性,因为它是一个形式参数。
来自C99
以下标识符没有链接性:声明为除对象或函数之外的任何内容的标识符;声明为函数参数的标识符;在没有extern存储类说明符声明的对象的块范围标识符。
此外,在C99中,b具有外部链接性。在C++中,文件作用域中的const限定变量具有内部链接性。

-2

a、b和c都具有相同的链接,如果它们在全局范围内声明,那么它们看起来是这样的。

d是一个函数参数,在调用该函数时创建,并且在函数返回时不再存在。


d是一个函数参数,但我认为OP谈论的是函数本身,该函数是公开可访问的。 - tdammers
3
int c 上的 'static' 关键字表示它在当前源文件之外不可用。 - tdammers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接