Linux 为什么在扩展宏时检测到递归;内联“;?

Linux 为什么在扩展宏时检测到递归;内联“;?,linux,gcc,kernel,Linux,Gcc,Kernel,我正在x86_64 linux主机上构建32位(i386)linux内核。主机和目标版本均为2.6.9。我在linux源代码树中执行以下操作: make ARCH=i386 CFLAGS='-m32 -Iinclude/asm/mach-default' AFLAGS='--32' menuconfig make ARCH=i386 CFLAGS='-m32 -Iinclude/asm/mach-default' AFLAGS='-m32 -Iinclude/asm/mach-default'

我正在x86_64 linux主机上构建32位(i386)linux内核。主机和目标版本均为2.6.9。我在linux源代码树中执行以下操作:

make ARCH=i386 CFLAGS='-m32 -Iinclude/asm/mach-default' AFLAGS='--32'  menuconfig
make ARCH=i386 CFLAGS='-m32 -Iinclude/asm/mach-default' AFLAGS='-m32 -Iinclude/asm/mach-default'
我会在第二个make中遇到以下错误:

  AS      arch/i386/kernel/entry.o
In file included from include/linux/bitops.h:4,
                 from include/asm/cpufeature.h:10,
                 from include/asm/processor.h:16,
                 from include/asm/thread_info.h:16,
                 from arch/i386/kernel/entry.S:45:
include/asm/bitops.h:42: detected recursion whilst expanding macro "inline"
bitops.h中的第42行如下所示:

static inline void set_bit(int nr, volatile unsigned long * addr)
由于gcc支持内联函数,我不明白为什么这个“内联”被视为宏,为什么会有递归扩展“内联”

我的gcc版本是:

gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11)

任何见解都将不胜感激

通过错误消息,关键字
inline
已被宏覆盖(这是未定义的行为)。它可能类似于
#define inline uu属性uu((inline))
,因为预处理器抱怨它是递归的。查看
#define
。我猜:
inline
在其他地方定义为宏,因此可以将构建配置为生成或不生成内联函数(通过将其定义为“inline”或“”)。这里似乎很容易出现递归扩展问题,但我不知道为什么在未修改的源代码树上会出现这种问题。确实有这样的定义:#定义内联-内联-属性uuu((始终内联))在compiler-gcc3.h和compiler-gcc+.h中。但是,基于“自引用宏”规则,应该不会引起任何问题。顺便问一下,“自引用宏”规则是否因为某种原因被禁用?只是为了跟进,我发现错误基本上是由gcc和内核版本不匹配引起的。内核要求gcc版本2.95.3,但我的gcc是3.4.6。最终我转向了需要gcc 3.2的Linux 2.6.24,然后所有错误都消失了:-)