2012-05-23 77 views
0

以下是奇怪的!Cmake ARGV和宏BUG?

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) 

(應該給 「IF」) WORKS!

foo("gaga" false) 

(應該給 「ELSE」,因爲第二個可選的參數是假的!)

結果錯誤:

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

這是一個錯誤?

以下工作:

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

爲什麼???

感謝您的幫助!

(帶功能它的工作原理)

回答

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

0
if(NOT ARGV1 AND ARGV2) 

是一樣的as

if(ARGV2 AND NOT ARGV1) 

邏輯否定(和大多數其他一元運算符)在結合之前進行綁定。