gpt4 book ai didi

c - 静态变量名称是否与 C 中允许的函数名称相同?

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:06 25 4
gpt4 key购买 nike

我在处理一些 C 输出问题时发现了以下代码:

http://ideone.com/O0tQnr

在这段代码中,可以看到,在 main 内部,声明了一个具有相同名称的静态变量。为此,我在 Stack-Overflow 上搜索并找到了

How are static variables with the same name in different functions identified by the System?

针对此问题给出的答案提出了不同的方法,即。

  1. 静态变量的名称通常包含在调试符号表中。
  2. 一些嵌入式的(编译器)只是在每个重复名称的末尾添加一个数字
  3. 它们可能在 table 上被弄乱了。

我想知道静态变量实际上是如何在 C 中实现的,因为所有的答案都暗示了一些不同的东西?

同时为了检查这是否只是一次性机会,我还运行了代码:

http://ideone.com/zpRVCa

但是错误:

prog.c:5:21: error: called object ‘GetSize’ is not a function or function pointer
int myvar=GetSize(GetSize);
^
prog.c:4:11: note: declared here
static GetSize;
^

表示编译器发现了冲突的声明/重新声明了Getsize。

最佳答案

如果不同的实体具有不同的范围或在不同的 namespace 中,则它们可能具有相同的标识符1。对于 int main() { static int main; ... ,第一个 main 具有文件作用域,第二个 main 具有 block 作用域。

在任何特定点, namespace 中只有一个标识符是可见的。在 GetSize(GetSize) 中,只有 static GetSize 是可见的。它隐藏了 int GetSize(int),因此函数 GetSize 不可见。因此,这段代码会出错。

在文件范围内使用 static 声明的标识符具有内部链接。在没有 extern 的 block 范围内声明的对象标识符(包括具有 static 的对象标识符)没有链接。因为这些标识符没有外部链接,所以它们永远不需要在当前翻译单元之外被知道。因此,这些标识符不需要出现在目标文件中:它们的名称不需要对链接器可见。它们通常由编译器在编译翻译单元期间生成的代码访问,并且此代码以数字方式(通过内存中的位置)而不是名称来寻址对象。

许多 C 实现提供调试工具。调试器通常需要知道事物的名称,即使它们具有内部链接或没有链接。在这些情况下,C 实现可以使用它希望的任何方案来记录有关名称的信息。


1 C的命名空间有:标签名;结构、 union 和枚举的标签;结构或 union 的成员(每个结构或 union 的单独空间);和所有其他标识符。该标准还提到了宏名称的 namespace 。

关于c - 静态变量名称是否与 C 中允许的函数名称相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18495991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com