Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 宏if语句返回错误:运算符'&&';没有正确的操作数_C_Macros_C Preprocessor - Fatal编程技术网

C 宏if语句返回错误:运算符'&&';没有正确的操作数

C 宏if语句返回错误:运算符'&&';没有正确的操作数,c,macros,c-preprocessor,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版本代码和内核版本在LINUX源代码中定义,内核补丁级别在我的Makefile中定义 KERNEL_PATCH_LEVEL :=$(

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

error: operator '&&' has no right operand
宏代码为:

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

其中LINUX版本代码和内核版本在LINUX源代码中定义,内核补丁级别在我的Makefile中定义

KERNEL_PATCH_LEVEL :=$(word 1, $(subst ., ,$(word 2, $(subst -, ,$(KERNEL_HEADERS)))))
如果我将代码更改为两行不同的代码,如下图所示,它可以工作:

#if LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49) 
#if KERNEL_PATCH_LEVEL == 11
  ...
#endif //KERNEL_PATCH_LEVEL == 11
#endif 
是否还可以保留一个“如果”? 我使用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)

结果表明,错误源是,
内核补丁级别
在makefile中定义,但为空

在这种情况下,这两条线并不相等,因为

#if LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49) && KERNEL_PATCH_LEVEL == 11
无论第一次测试的结果如何,都会对这两个部分进行求值,因此预处理器在遇到
&&==11
时会遇到语法错误

但是如果
LINUX\u VERSION\u code==KERNEL\u 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
(这是错误的,因为worth
#if==11
)属于预处理器跳过的块,这说明没有错误

请注意,如果未定义
内核修补程序级别
\if
将其视为
0
,则不会触发任何错误

您可以使用此选项防止定义不清的
内核\u补丁\u级别
(如中所示,我现在添加了一个更好的答案)

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

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

尝试
#endif
而不是
#end
。嗨,很抱歉,我编辑了SO问题中的代码,但问题仍然相关。你“不想要这个”是什么意思?有必要为每一个项目设置相应的#endif#if@machine_1我只想要一个if语句。为什么我需要2个if语句而不是使用&&operator?如果它在两个单独的行中工作,那么我会尝试在原始(一行)表达式中的每个术语上加括号。解决此问题的最佳做法是什么?如果为空,在我的makefile中虚拟定义内核\u补丁\u级别?由于#如果定义(内核补丁级别)不起作用,那么内核补丁级别已定义但“不正确”,我认为我宁愿得到编译问题,也不愿将其定义为伪0,这在某些情况下会伤害我,并且很难检测到。因为它只在第二个if中失败。对于有问题的内核,我将输入第一个if,我宁愿失败,然后通过0(因为内核版本以0结尾)。
#if (0-KERNEL_PATCH_LEVEL-1)==1 && (KERNEL_PATCH_LEVEL+0)!=-2
#error "KERNEL_PATCH_LEVEL defined empty"
#endif