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

时间:2015-10-22 22:56:27

标签: c makefile preprocessor-directive

我有一个头文件,其预处理器指令定义如下:

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

现在我有两个不同的C文件,我已将此标题包括在内。 当我在这两个文件中打印它的值时,值是不同的!该程序非常大,并且正在使用多个预处理器宏。

C档案#1 DIV的值是2

C档案#2 DIV的价值是8!

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

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

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

事实证明,DIV本身并未在很多地方定义过。但是X和Y已经存在于父目录的不同文件夹中,其中存在许多应用程序。

一个。 Evertime我做> make;我假设重新计算了预处理程序指令的值?

湾make文件中的一个依赖项是否有错?如果其中一个依赖项具有不同的头文件,其中x,Y定义了?

℃。如果复杂的文件夹结构在不同的目录中定义了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的价值在其中一个程序中是好的而在另一个程序中是错误的!

1 个答案:

答案 0 :(得分:1)

不,这不是make或编译器中的错误。这是Makefile中的错误或您的期望。可悲的是,您提供的信息令人困惑,而且无用。首先,C中的标识符区分大小写。你有时使用x,有时是X.那不是很勤奋。

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

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

应该提供一个线索,在哪里查找X的定义。