c - 宏 if 语句返回错误 : operator '&&' has no right operand

标签 c macros c-preprocessor

我在许多 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中定义但是为空。

在这种情况下,这两行是不等价的,因为

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

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

但是如果 LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49) 为 false,则使用此构造:

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

您没有输入第一个 #if,所以输入内部 #if(这是错误的,因为值 #if == 11)属于预处理器跳过的 block ,这说明没有错误。

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

你可以防止定义错误的KERNEL_PATCH_LEVEL(在Test for empty macro definition中看到,我现在添加了一个更好的答案)

#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

关于c - 宏 if 语句返回错误 : operator '&&' has no right operand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48538243/

相关文章:

C宏处理

c - 为什么 double 在 MINIX 3 中不起作用?

c - 从c中的列表中读取函数中的结构

c - 为字符指针分配内存

c - 如何在 C 中取消引用 NULL 指针不会使程序崩溃?

c - 了解部分代码

arrays - 如何使用基本的SAS宏阵列?

c - 用宏函数替换 C 中的函数

c++ - 当#define 在 #if 中时, token "#"错误之前缺少二元运算符

C 预处理器通过连接和字符串化生成宏