从数组定义的完整性检查

问题描述 投票:0回答:1

我在狩猎中的错误的原因,并认为我可能已经发现,如果我使用#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 definition
1个回答
3
投票

用C #define的工作方式是,它创建了一个扩展,这正是DEF_VALUE发生时,编译器将它仿佛values[x]写的任何地方。所述下预处理器有效地应用这些扩展重新写入代码,并将所得重新编写的代码是什么提供给编译器。

在这种情况下,改变x具有改变什么DEF_VALUE最终评估为的效果,但不是它扩展到。

在你的第二个情况下,它扩展到7当且仅当x2。如果这#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存在于该范围它不能编译。

© www.soinside.com 2019 - 2024. All rights reserved.