昨晚我被问到了一个C语言问题,但由于自己大学以来很少使用C语言,所以我不知道答案,我想也许我可以在这里找到答案,而不是就此忘记。
如果一个人有这样的定义:
#define count 1
那个人能否使用内部的数字 1 找到变量名为
count
呢?我认为不行,因为我认为 count 只是指向 1,但我看不出 1 怎么可能指回 count。
昨晚我被问到了一个C语言问题,但由于自己大学以来很少使用C语言,所以我不知道答案,我想也许我可以在这里找到答案,而不是就此忘记。
如果一个人有这样的定义:
#define count 1
count
呢?#define
是一个预处理器指令,因此它不是一个“变量”
如果是宏,它会被预处理并编译。因此,绝对无法找到该名称,因为在预处理器完成工作后,结果文件中的每个位置都将包含“1”而不是“count”。
所以答案是否定的。
这不是指针,而只是字符串/令牌替换。预处理器在代码编译之前替换所有的#define。大多数编译器包括-E或类似参数以发出预编译代码,因此您可以看到在处理所有#指令后代码的样子。
更直接地回答您的问题,没有办法告诉代码中的令牌正在被替换。您的代码甚至无法区分(count == 1)和(1 == 1)之间的区别。
如果您真的想这样做,可能可以使用源文件文本分析,例如使用差异工具。
你那里实际上不是一个变量,而是一个预处理器指令。当你编译代码时,预处理器会遍历该文件并将所有单词“count”的实例替换为1。
你可能会问,如果我知道1,我能找到指向它的count吗?不行。因为变量名和值之间的关系不是双射,所以无法回溯。考虑以下情况
int count = 1;
int count2 = 1;
完全合法,但1应该解析为什么?
int i = count;
此时,他们可以向后搜索并找到该行
#define count 1
然而,如果他们只有变量iDontKnowWhat,并且可以看到它包含1,那么就无法将其追溯回“count”。
为什么?因为#define在预处理器时间评估,这甚至发生在编译之前(尽管对于几乎所有人来说,它可以被视为编译的第一阶段)。因此,源代码是唯一具有关于“count”的任何信息的东西,例如知道它曾经存在过。当编译器开始工作时,每个对“count”的引用都已被数字“1”替换。
#define ZERO 0
#define ONE 1
#define TWO 2
对比
enum {
ZERO,
ONE,
TWO
};
x = TWO;
如果您使用枚举而不是 #define,一些调试器将能够显示值的符号形式 TWO,而不仅仅是数字值 2。