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。相关: