【问题标题】:i386 macro predefined in make or gcc?在make或gcc中预定义的i386宏?
【发布时间】:2012-01-13 20:49:03
【问题描述】:

我一直在尝试为我的代码可以支持的每个架构创建一个文件夹。此文件夹中包含要包含的特定于平台的文件。我将它们包括如下:

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

#include ASSTR(ARCHITECTURE/sizes.h)

我在 make 中的编译行如下所示:

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

这可行,直到我将 ARCHITECTURE 定义为 i386。发生这种情况时,它会查找 1/sizes.h,所以我假设它已经在某个地方定义了。

【问题讨论】:

标签: gcc makefile


【解决方案1】:

我相信 gcc 调用的 C 预处理器 (cpp) 定义了 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-i386solaris-i386 或您正在使用的任何平台。
  • 如果您在符合标准的模式下调用它(例如-ansi-std=c99),它不会定义i386。见stackoverflow.com/questions/8677390/…
  • @DanFego 这就是我所做的。 x86 是 i386 的有效别名吗?从技术上讲,我在搞乱 grub 和内核开发,所以它既不是 linux 也不是 solaris XD。
猜你喜欢
  • 2014-01-02
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多