我有一个头文件,其预处理器指令定义如下:
#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的价值在其中一个程序中是好的而在另一个程序中是错误的!
答案 0 :(得分:1)
不,这不是make或编译器中的错误。这是Makefile中的错误或您的期望。可悲的是,您提供的信息令人困惑,而且无用。首先,C中的标识符区分大小写。你有时使用x,有时是X.那不是很勤奋。
C宏的扩展取决于精确序列中#define
和#undef
指令的顺序,由-Idirectory
选项的序列控制。也可以使用-DX=...
选项设置宏,覆盖标题中的任何内容。您没有向我们展示执行判断的实际命令行。首先,
find . -name '*.h' | xargs grep 'define.*X'
应该提供一个线索,在哪里查找X
的定义。