2

我可以想象var函数内的静态变量func被命名为var@func

全局静态和非静态变量呢?

4

2 回答 2

5

编译器不需要使用内部链接来唯一命名事物,例如静态变量和函数。您不能访问翻译单元之外的静态对象,因此链接器不需要为它们获取名称。

具有外部链接的全局变量通常不会对其名称进行太多修饰或修饰,并且通常与函数完全相同。单个前导下划线并不少见。

于 2011-06-08T01:34:33.173 回答
3

补充一点,因为这里给出的信息至少是不完整的。大多数编译器都会为静态变量创建“本地”符号,是的,由于静态变量在函数范围内的命名不是唯一的,它们必须修改名称。例如,gcc 通过在名称上附加一个点和一个唯一的数字来做到这一点。由于点不是任何有效标识符的一部分,因此可以确保没有名称冲突。

当编译器支持标识符中的通用字符时,事情变得模糊不清。根据环境,编译器必须修改这些标识符,因为例如加载程序可能不支持符号表中的这些字符。

icc 选择类似用 _uXXXX 替换这样的字符,其中 XXXX 是字符的十六进制表示。在这种情况下(icc),这会导致两个微妙的编译器错误。首先,这种修改使用了允许用户使用的有效标识符,因此它们可能会与来自同一编译单元甚至来自其他单元的标识符的全局符号发生冲突。其次,icc 甚至混淆了它自己的内部命名,并且只为一个静态变量保留空间,如果它们也被声明,例如也被volatile完全声明为荒谬。

于 2011-06-08T08:47:19.710 回答