以下是奇怪的!
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)
(应该给“如果”) WORKS!
BUT
foo("gaga" false)
(应该给“ELSE”,因为第二个可选参数是FALSE!)
导致错误:
cmake:126 (if):
given arguments: "NOT" "false" "AND"
Unknown arguments specified
这是一个错误吗?
以下作品:
if( NOT "${ARGV1}" AND "${ARGV2}" )
message("IF")
else()
message("ELSE")
endif()
WHY ???
感谢任何帮助!
(功能有效)
答案 0 :(得分: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
答案 1 :(得分:0)
if(NOT ARGV1 AND ARGV2)
与
相同if(ARGV2 AND NOT ARGV1)
逻辑否定(以及大多数其他一元运算符)在连接之前绑定。