我在狩猎中的错误的原因,并认为我可能已经发现,如果我使用#define
的理解是正确的。
据我了解,一旦你定义的东西,它的一套方式,即使定义充满了变量的值,它在编译时的价值,并坚持如果变量后来改变也不会改变?所以这个代码:
int values[] = {5,6,7,8};
int x = 0;
#define DEF_VALUE values[x]
DEF_VALUE将是5个,图5是的值数组中的位置0的值。
但是,如果我这样做:
int values[] = {5,6,7,8};
int x = 0;
#define DEF_VALUE values[x]
x = 2;
DEF_VALUE仍然是5因为这是值的输出的[X]中的#define被称为时间,所以以后改变x的值设定为2不会导致在DEF_VALUE至7的变化(的位置2中的值值数组)。
这里是我的逻辑是否正确?
如果是这样,我想我已经找到了我的错误,因为这码的原程序员是靠更新X后面的位置地址选择的代码来更新DEF_VALUE的价值。
用C #define
的工作方式是,它创建了一个扩展,这正是DEF_VALUE
发生时,编译器将它仿佛values[x]
写的任何地方。所述下预处理器有效地应用这些扩展重新写入代码,并将所得重新编写的代码是什么提供给编译器。
在这种情况下,改变x
具有改变什么DEF_VALUE
最终评估为的效果,但不是它扩展到。
在你的第二个情况下,它扩展到7
当且仅当x
是2
。如果这#define
在另一范围使用,那么结果是未知的,或者根据什么变量语法错误都存在。
一些测试代码:
void demo() {
int values[] = {5,6,7,8};
int x = 0;
#define DEF_VALUE values[x]
x = 2;
printf("%d\n", DEF_VALUE);
}
这表明7
预期。
一旦预处理器已经与此代码完成了它以这种形式结束:
void demo() {
int values[] = {5,6,7,8};
int x = 0;
x = 2;
printf("%d\n", values[x]);
}
如果后面的代码中你有这样的:
void other() {
printf("%d\n", DEF_VALUE);
}
你得到一个语法错误。这是因为编译器被告知与工作代码居然是:
void other() {
printf("%d\n", values[x]);
}
既不values
也不x
存在于该范围它不能编译。