C - 宏 if 语句返回错误:运算符 '&&' 没有右操作数



我正在许多Linux机器上编译我的代码,在特定机器上,我收到以下错误:

error: operator '&&' has no right operand

宏代码为:

#if LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49) && KERNEL_PATCH_LEVEL == 11

其中LINUX_VERSION_CODE和KERNEL_VERSION在 Linux 源代码中定义,KERNEL_PATCH_LEVEL在我的 Makefile 中定义

KERNEL_PATCH_LEVEL :=$(word 1, $(subst ., ,$(word 2, $(subst -, ,$(KERNEL_HEADERS)))))

如果我像这样将代码更改为 2 行不同的行,它可以工作

#if LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49) 
#if KERNEL_PATCH_LEVEL == 11
...
#endif //KERNEL_PATCH_LEVEL == 11
#endif 

还有可能用一个 #if 保存它吗? 我使用 gcc 版本 4.9.0 (Debian 4.9.0-7)

以下宏不起作用:

#if (LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49)) && (KERNEL_PATCH_LEVEL == 11)  
#if ((LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49)) && (KERNEL_PATCH_LEVEL == 11))  
#if defined(KERNEL_MAJOR) && defined(KERNEL_MINOR) && defined(KERNEL_MICRO) && defined(KERNEL_PATCH_LEVEL) && defined(KERNEL_VERSION) && 
defined(LINUX_VERSION_CODE) && 
(LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49)) && (KERNEL_PATCH_LEVEL == 11)

事实证明,错误源是KERNEL_PATCH_LEVEL在makefile中定义但为空。

在这种情况下,这 2 行并不等效,因为

#if LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49) && KERNEL_PATCH_LEVEL == 11

无论第一次测试的结果如何,都会评估这两个部分,因此预处理器在满足&& == 11时偶然发现语法错误。

但如果LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49)是假的,则使用以下构造:

#if LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49) 
#if KERNEL_PATCH_LEVEL == 11
...
#endif //KERNEL_PATCH_LEVEL == 11
#endif 

您没有输入第一个#if因此内部#if(这是错误的,因为值得#if == 11)属于预处理器跳过的块,这解释了没有错误。

请注意,如果未定义KERNEL_PATCH_LEVEL#if将其视为0,这不会触发任何错误。

您可以使用此功能防止定义不明确的KERNEL_PATCH_LEVEL(请参阅空宏定义的测试,我现在添加了更好的答案)

#if (KERNEL_PATCH_LEVEL + 0) == 0
#undef KERNEL_PATCH_LEVEL
#define KERNEL_PATCH_LEVEL 0
#endif

因此,如果宏定义为空(或为 0),请取消定义它并将其定义为0值。您甚至可以检测(请参阅我在上面的链接中的回答以了解它是如何工作的)它是否为空而不是像这样0

#if (0-KERNEL_PATCH_LEVEL-1)==1 && (KERNEL_PATCH_LEVEL+0)!=-2
#error "KERNEL_PATCH_LEVEL defined empty"
#endif

相关内容

最新更新