在C语言中查找变量的名称

3

昨晚我被问到了一个C语言问题,但由于自己大学以来很少使用C语言,所以我不知道答案,我想也许我可以在这里找到答案,而不是就此忘记。

如果一个人有这样的定义:

#define count 1

那个人能否使用内部的数字 1 找到变量名为 count 呢?
我认为不行,因为我认为 count 只是指向 1,但我看不出 1 怎么可能指回 count。
18个回答

8

基于 @Cade Roux 的回答,如果你使用预处理器 #define 来将一个值与一个符号关联起来,一旦预处理器运行完成,代码就不会再引用这个符号:

#define COUNT (1)
...
int myVar = COUNT;
...

预处理器运行后:

...
int myVar = (1);
...

因为其他人已经指出了,所以这基本上意味着“不”,原因如上所述。

7
简单的回答是不能。像这样的#Defines由预处理器处理,且它们只能指向一个方向。当然,另一个问题是即使编译器也不知道 - 因为“1”可以指向任何东西 - 多个变量可以同时具有相同的值。

6

那个人能否使用内部的1找到变量名“count”?

不行


5
我相信,比我更有口才和经验的人会指出 #define 的东西并没有编译进源代码中,它只是一个预处理器宏,将遍历源代码并将找到的所有 'count' 实例更改为 '1'。
然而,为了更深入地回答你所问的问题,因为 C 是一种编译语言,可以编译成机器码,你永远不会像 Java 或 C# 这样的语言那样拥有反射和内省。在编译后,所有的命名都丢失了,除非你的源代码/编译器周围有一个框架来执行一些巧妙的操作。
希望这能帮到你。(请原谅双关语)

这是对我刚回答的一个关于在构造函数中使用“this”的问题的引用。 - Henry B

3

很遗憾,这是不可能的。

#define 语句是预处理器的指令,所有 count 的实例都将被替换为 1。在运行时,没有与 count 相关联的内存位置,因此这种尝试显然是徒劳无功的。

即使您使用变量,在编译后,程序中使用的原始标识符也不会留下任何痕迹。这通常只在动态语言中才可能。


2
在C语言中,常用的一种技巧是在宏定义中使用“#”语法来获取宏参数的字符串字面量。
#define displayInt(val) printf("%s: %d\n",#val,val)
#define displayFloat(val) printf("%s: %d\n",#val,val)
#define displayString(val) printf("%s: %s\n",#val,val)

int main(){
  int foo=123;
  float bar=456.789;
  char thud[]="this is a string";

  displayInt(foo);
  displayFloat(bar);
  displayString(thud);

  return 0;
}

输出应该类似于以下内容:
foo: 123
bar: 456.789
thud: this is a string

它可能并没有直接回答这个问题,但我发现它对我来说非常有用、清晰和有帮助。 - ViennaMike

2

#define count 1 是一个很糟糕的想法,因为它会阻止您给任何变量或结构体字段命名为 count

例如:

void copyString(char* dst, const char* src, size_t count) {
   ...
}

你的count宏会将变量名替换为1,导致该函数无法编译:

void copyString(char* dst, const char* src, size_t 1) {
   ...
}

1

C定义是预处理指令,而不是变量。预处理器将浏览您的C文件,并在编译之前使用您定义的内容替换count的位置。查看混淆的C竞赛条目,以了解对此和其他预处理指令的特别启示用法。

关键在于没有“计数”来指向“1”值。这只是一个简单/查找替换操作,在代码实际编译之前发生。

我会把这留给真正了解C语言的人进行更正。


1

count 不是一个变量。它没有分配存储空间,也没有在符号表中注册。它是一个宏,在将源代码传递给编译器之前由预处理器替换。

如果您没有完全提出正确的问题,有一种方法可以使用宏获取名称:

#define SHOW(sym) (printf(#sym " = %d\n", sym))
#define count 1

SHOW(count); // prints "count = 1"

# 运算符将宏参数转换为字符串字面量。


0
你说的“finding”是什么意思?
这行代码。
#define count 1

定义了一个值为1的符号“count”。

编译过程的第一步(称为预处理)将替换每个符号“count”的出现次数为1,因此如果您有:

if (x > count) ...

它将被替换为:

if (x > 1) ...

如果你理解了这句话,你就会明白为什么“查找计数”是没有意义的。

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