0

下面就奇怪了!

macro(foo in1)
  message("FIRST" ${in1})
  message("OPtional1:" ${ARGV1})
  message("OPtional2:" ${ARGV2})
if( NOT ${ARGV1} AND ${ARGV2} )
   message("IF")  
else()
   message("ELSE")  
endif()
endmacro()

运行以下:

foo("gaga" false true)   

(应该给出“如果”)有效!

foo("gaga" false)   

(应该给出“ELSE”,因为第二个可选参数是 FALSE!)

结果错误:

cmake:126 (if):
given arguments:  "NOT" "false" "AND"
Unknown arguments specified

这是bug吗??

以下作品:

if( NOT "${ARGV1}" AND "${ARGV2}" )
   message("IF")  
else()
   message("ELSE")  
endif()

为什么???

谢谢你的帮助!

(它的功能是有效的)

4

2 回答 2

3

在宏中,ARGV1 等不是真正的 CMake 变量。相反,${ARGV1}是宏调用中的字符串替换。这意味着您只有一个参数的调用扩展为

if( NOT false AND )

这解释了错误消息。通过将字符串扩展括在引号中,您现在有了

if( NOT "false" AND "")

给 IF 命令一个空字符串来评估。其他解决方案:在尝试扩展 ARGV2 之前,使用 ${ARGC} 字符串替换来确定参数是否存在。或者,正如您所提到的,切换到函数而不是宏。在函数中,ARGV1 是一个实际的 CMake 变量,您可以更合理地编写它,即使根本没有 ${} 扩展:

function(foo in1)
  message("Optional1: " ${ARGV1})
  message("Optional2: " ${ARGV2})
if( NOT ARGV1 AND ARGV2 )
   message("IF")  
else()
   message("ELSE")  
endif()
endfunction()

参考: http ://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:macro

于 2012-05-23T15:55:41.720 回答
0
if(NOT ARGV1 AND ARGV2)

是相同的

if(ARGV2 AND NOT ARGV1)

逻辑否定(和大多数其他一元运算符)在合取之前绑定。

于 2013-02-07T08:31:58.403 回答