昨晚我被问到了一个C语言问题,但由于自己大学以来很少使用C语言,所以我不知道答案,我想也许我可以在这里找到答案,而不是就此忘记。
如果一个人有这样的定义:
#define count 1
那个人能否使用内部的数字 1 找到变量名为
count
呢?我认为不行,因为我认为 count 只是指向 1,但我看不出 1 怎么可能指回 count。
昨晚我被问到了一个C语言问题,但由于自己大学以来很少使用C语言,所以我不知道答案,我想也许我可以在这里找到答案,而不是就此忘记。
如果一个人有这样的定义:
#define count 1
count
呢?基于 @Cade Roux 的回答,如果你使用预处理器 #define 来将一个值与一个符号关联起来,一旦预处理器运行完成,代码就不会再引用这个符号:
#define COUNT (1)
...
int myVar = COUNT;
...
预处理器运行后:
...
int myVar = (1);
...
那个人能否使用内部的1找到变量名“count”?
不行
很遗憾,这是不可能的。
#define
语句是预处理器的指令,所有 count
的实例都将被替换为 1
。在运行时,没有与 count
相关联的内存位置,因此这种尝试显然是徒劳无功的。
即使您使用变量,在编译后,程序中使用的原始标识符也不会留下任何痕迹。这通常只在动态语言中才可能。
#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 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) {
...
}
C定义是预处理指令,而不是变量。预处理器将浏览您的C文件,并在编译之前使用您定义的内容替换count的位置。查看混淆的C竞赛条目,以了解对此和其他预处理指令的特别启示用法。
关键在于没有“计数”来指向“1”值。这只是一个简单/查找替换操作,在代码实际编译之前发生。
我会把这留给真正了解C语言的人进行更正。
count
不是一个变量。它没有分配存储空间,也没有在符号表中注册。它是一个宏,在将源代码传递给编译器之前由预处理器替换。
如果您没有完全提出正确的问题,有一种方法可以使用宏获取名称:
#define SHOW(sym) (printf(#sym " = %d\n", sym))
#define count 1
SHOW(count); // prints "count = 1"
#
运算符将宏参数转换为字符串字面量。
#define count 1
定义了一个值为1的符号“count”。
编译过程的第一步(称为预处理)将替换每个符号“count”的出现次数为1,因此如果您有:
if (x > count) ...
它将被替换为:
if (x > 1) ...