i386宏在make或gcc中预定义?

i386宏在make或gcc中预定义?,gcc,makefile,Gcc,Makefile,我一直在尝试为我的代码能够支持的每个体系结构创建一个文件夹。此文件夹中包含特定于平台的文件。我将其包括如下: #define STR(x) #x #define ASSTR(x) STR(x) #include ASSTR(ARCHITECTURE/sizes.h) make中的编译行如下所示: gcc -o $@ -c $< -DARCHITECTURE=i386 gcc-o$@-c$

我一直在尝试为我的代码能够支持的每个体系结构创建一个文件夹。此文件夹中包含特定于平台的文件。我将其包括如下:

#define STR(x) #x
#define ASSTR(x) STR(x)

#include ASSTR(ARCHITECTURE/sizes.h)
make中的编译行如下所示:

gcc -o $@ -c $< -DARCHITECTURE=i386
gcc-o$@-c$<-DARCHITECTURE=i386

这是可行的,直到我将架构定义为i386。发生这种情况时,它会查找1/size.h,因此我假设它已经在某个地方定义了。

我相信C预处理器(
cpp
)由
gcc
调用,它定义了
i386
(对于i386系统)。您可以了解它是如何定义的:

touch foo.h; cpp -dM foo.h; rm foo.h
此方法由
cpp
手册页在
-d
下描述,字符为
M
(因此,
-dM
):

为预处理器执行期间定义的所有宏(包括预定义宏)生成一个#define指令列表,而不是正常输出。这为您提供了一种查找预处理器版本中预定义内容的方法。假设您没有foo.h文件,则命令

    touch foo.h; cpp -dM foo.h
将显示所有预定义的宏


有道理。我仍然希望为每个体系结构使用一个单独的目录,因此我可能不会使用
#ifdef i386
@roadkillguy:也许是为了帮助将来的可移植性(并解决这个问题),您可以使用类似于
linux-i386
solaris-i386
或您正在使用的任何平台。如果您在标准一致性模式下调用
i386
(例如
-ansi
-std=c99
),它不会定义
i386
)。看@DanFego我就是这么做的。x86是i386的有效别名吗?从技术上讲,我正在处理grub和内核开发,因此它既不是linux也不是solaris XD。相关: