在C中查找变量名
昨晚有人用C问了我一个问题,我不知道答案,因为我从大学开始就很少用C,所以我想也许我可以在这里找到答案,而不是忘记它 如果某人有以下定义:在C中查找变量名,c,constants,c-preprocessor,C,Constants,C Preprocessor,昨晚有人用C问了我一个问题,我不知道答案,因为我从大学开始就很少用C,所以我想也许我可以在这里找到答案,而不是忘记它 如果某人有以下定义: #define count 1 此人能否使用变量名中的1找到变量名count 我不这么认为,因为我以为计数会指向1,但不知道1如何指向计数。你说的“查找”是什么意思 线路 #define count 1 定义值为1的符号“计数” 编译过程的第一步(称为预处理)将用1替换每次出现的符号计数,以便: if (x > count) ... 将替换为:
#define count 1
此人能否使用变量名中的1找到变量名count
我不这么认为,因为我以为计数会指向1,但不知道1如何指向计数。你说的“查找”是什么意思
线路
#define count 1
定义值为1的符号“计数”
编译过程的第一步(称为预处理)将用1替换每次出现的符号计数,以便:
if (x > count) ...
将替换为:
if (x > 1) ...
如果你明白了这一点,你就会明白为什么“查找计数”毫无意义。
\define
是一个预处理器指令,因此它不是一个“变量”C define是一个预处理器指令,而不是一个变量。在编译之前,预处理器将检查您的C文件,并将您写入计数的位置替换为您定义的位置。查看模糊的C竞赛条目,了解此指令和其他预处理器指令的一些特别有启发性的用法
关键是没有“计数”指向“1”值。它只是一个简单的/find-replace操作,甚至在真正编译代码之前发生
我将把它保留为可编辑状态,让真正了解C的人来修改
那个人能用里面的1找到变量名“count”吗
不简单的答案是不,他们不能#这样的定义由预处理器处理,它们只指向一个方向。当然,另一个问题是,即使是编译器也不知道——因为“1”可以指向任何东西——多个变量可以同时具有相同的值。我相信比我更能说会道、更精通的人会指出,定义的东西没有编译到源代码中,您拥有的是一个预处理器宏,它将遍历源代码,并使用“1”更改它找到的“count”的所有实例 然而,为了更清楚地说明你被问到的问题,因为C是一种编译语言,一直到机器代码,你永远不会像Java或C#这样的语言那样进行反思和反思。编译后所有的命名都会丢失,除非您有一个围绕源代码/编译器构建的框架来做一些漂亮的事情
希望这有帮助。(请原谅这句双关语)这里的实际上不是一个变量,而是一个预处理器指令。当您编译代码时,预处理器将检查并用1替换该文件中单词“count”的所有部分 你可能会问我是否知道1我能找到它的计数点吗?不,因为变量名和值之间的关系不是双射关系,所以没有回头路。考虑
int count = 1;
int count2 = 1;
完全合法,但我应该解决什么问题 基于@Cade Roux的答案,如果使用预处理器#define将值与符号关联,则在预处理器运行后,代码将不会引用符号:
#define COUNT (1)
...
int myVar = COUNT;
...
预处理器运行后:
...
int myVar = (1);
...
正如其他人所指出的,出于上述原因,这基本上意味着“不”
首先,define不是一个变量,它是一个编译器预处理器宏
当编译器的主阶段开始工作时,名称已被值替换,并且名称“count”将不存在于编译的代码中的任何位置
对于变量,在运行时不可能在C代码中找到变量名。这些信息没有保存。与Java或C#等语言不同,C在编译到汇编语言时根本不保留太多元数据。以“#”开头的指令由预处理器处理,预处理器通常在将代码传递到“真实”编译器之前进行文本替换。因此,没有称为count的变量,这就好像代码中的所有“count”字符串都被神奇地替换为“1”字符串
因此,没有,没有办法找到“变量”。对于宏,这是预处理的,结果输出是编译的。因此,绝对无法找到该名称,因为在预处理器完成其工作后,生成的文件中的所有位置都将包含“1”而不是“count”
所以答案是否定的。不幸的是,这是不可能的
#define
语句是预处理器的指令,所有count
实例都替换为1
。在运行时,没有与count
关联的内存位置,因此这项工作显然是徒劳的
即使您使用的是变量,在编译之后,程序中使用的原始标识符也不会有任何残留。这通常只在动态语言中才可能实现。如果他们正在查看C源代码(它们将在调试器中),那么他们将看到如下内容
int i = count;
在这一点上,他们可以搜索回来,找到线
#define count 1
然而,如果他们所拥有的只是变量iDontKnowWhat,并且他们可以看到它包含1,那么就无法将其追溯到“count”
为什么??因为#define是在预处理器时计算的,甚至在编译之前就发生了(尽管对于几乎所有人来说,它都可以被视为编译的第一阶段)。因此,源代码是唯一拥有“count”相关信息的东西,比如知道它曾经存在过。当编译器查看时,对“count”的每个引用都已替换为数字“1” 它不是指针,只是字符串/令牌替换。在代码编译之前,预处理器将替换所有#定义。大多数编译器都包含一个-E或类似的参数来发出预编译代码,因此您可以在处理完所有#指令后看到代码的样子<
#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
#define ZERO 0
#define ONE 1
#define TWO 2
enum {
ZERO,
ONE,
TWO
};
x = TWO;
#define SHOW(sym) (printf(#sym " = %d\n", sym))
#define count 1
SHOW(count); // prints "count = 1"
void copyString(char* dst, const char* src, size_t count) {
...
}
void copyString(char* dst, const char* src, size_t 1) {
...
}