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

3

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

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

#define count 1

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

0

#define 是一个预处理器指令,因此它不是一个“变量”


0
通常情况下不能得到变量名。
首先,#define 不是变量,它是编译器预处理器宏。
当编译器的主要阶段开始工作时,名称已被替换为值,并且名称“count”将不会出现在编译的代码中。
对于变量,在运行时无法找到 C 代码中的变量名称。这些信息未保存。与 Java 或 C# 等语言不同,C 几乎没有保留元数据,而是编译成汇编语言。

0
以"#"开头的指令由预处理器处理,通常在将代码传递给“真正的”编译器之前进行文本替换。 因此,在你的代码中没有称为 count 的变量,就好像所有的 "count" 字符串都被神奇地替换为 "1" 字符串一样。所以,无法找到该“变量”。

0

如果是宏,它会被预处理并编译。因此,绝对无法找到该名称,因为在预处理器完成工作后,结果文件中的每个位置都将包含“1”而不是“count”。

所以答案是否定的。


0

这不是指针,而只是字符串/令牌替换。预处理器在代码编译之前替换所有的#define。大多数编译器包括-E或类似参数以发出预编译代码,因此您可以看到在处理所有#指令后代码的样子。

更直接地回答您的问题,没有办法告诉代码中的令牌正在被替换。您的代码甚至无法区分(count == 1)和(1 == 1)之间的区别。

如果您真的想这样做,可能可以使用源文件文本分析,例如使用差异工具。


0

你那里实际上不是一个变量,而是一个预处理器指令。当你编译代码时,预处理器会遍历该文件并将所有单词“count”的实例替换为1。

你可能会问,如果我知道1,我能找到指向它的count吗?不行。因为变量名和值之间的关系不是双射,所以无法回溯。考虑以下情况

int count = 1;
int count2 = 1;

完全合法,但1应该解析为什么?


0
如果他们正在查看 C 代码(在调试器中),那么他们会看到类似以下的内容。
int i = count;

此时,他们可以向后搜索并找到该行

#define count 1

然而,如果他们只有变量iDontKnowWhat,并且可以看到它包含1,那么就无法将其追溯回“count”。

为什么?因为#define在预处理器时间评估,这甚至发生在编译之前(尽管对于几乎所有人来说,它可以被视为编译的第一阶段)。因此,源代码是唯一具有关于“count”的任何信息的东西,例如知道它曾经存在过。当编译器开始工作时,每个对“count”的引用都已被数字“1”替换。


0
这个人提出的问题(是面试题吗?)可能是想让你区分使用 #define 常量和枚举类型。例如:
#define ZERO 0
#define ONE 1
#define TWO 2

对比

enum {
  ZERO,
  ONE,
  TWO
};

给定代码:
x = TWO;

如果您使用枚举而不是 #define,一些调试器将能够显示值的符号形式 TWO,而不仅仅是数字值 2。


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