同一预处理器指令的值在一个文件中是正确的,而在另一个文件中是错误的

The value of the same preprocessor directive is correct in one file and wrong in another

我有一个 header 文件,其中 pre-processor 指令定义如下:

#define X 10
#define Y 5
#define DIV (X/Y)

现在我有两个不同的 C 文件,我已将此 header 包含在其中。 当我在这两个文件中打印this的值时,值是不一样的!该程序相当大,并且正在使用多个预处理器宏。

C 文件 #1 DIV 的值为 2

C 文件 #2 DIV 的值为 8!

为什么会这样?这是我第一次遇到这样的错误。这是编译器错误还是 make 文件错误?

是不是因为在另一个header中定义了DIV?还是有更深层次的问题?

---------------- 已编辑 -------------- 更多信息:

原来DIV本身很多地方都没有定义。但是X和Y一直在parent目录下的不同文件夹下,里面有很多应用。

一个。每次我做>制作;我假设重新计算预处理器指令的值?

b。 make 文件中的依赖项之一是否有问题?如果其中一个依赖项具有不同的 header 文件,其中定义了 x、Y?

c。如果一个复杂的文件夹结构在不同的目录中有多个 header 并定义了 X 和 Y,那么预处理器指令的编译行为如何?

|_ Child 1
  |_ INC
    |_ Header 2 with x and y defined
  |_ Program 1 -> Has Header 2 included. X and Y defined.
|_ Child 2
  |_ INC
     |_ Header1 - Has X, Y & DIV defined
  |_ Program 2 -> Has Header 1 included. Value of DIV calculated using X, Y of which header?
  |_ Program 3 -> Has Header 1 included. Whats value of X, Y and DIV? Is it recalculated?

现在 DIV 的值在一个程序中是正确的,而在另一个程序中是错误的!

不,这不是 make 或编译器中的错误。这是您的 Makefile 或您的期望中的错误。遗憾的是,您提供的信息令人困惑,几乎毫无用处。首先,C 中的标识符区分大小写。你有时用x,有时用x,那不是很勤快

C 宏的扩展取决于 #define#undef 指令的精确顺序,由 -Idirectory 选项的顺序控制。也可以使用 -DX=... 选项设置宏,覆盖 header 中的任何内容。您没有向我们展示执行判断的实际命令行。对于初学者,

 find . -name '*.h' | xargs grep 'define.*X'

应该给出在哪里寻找 X 的定义的线索。