如何在c中破坏全局静态/非静态变量?

时间:2011-06-08 01:27:39

标签: c name-mangling

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

全局静态和非静态变量怎么样?

2 个答案:

答案 0 :(得分:4)

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

具有外部链接的全局变量通常不会对其名称应用太多的修改或修饰,并且它通常与应用于函数的完全相同。单个前导下划线并不是非常罕见。

答案 1 :(得分:2)

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

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

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