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)   

(「IF」を指定する必要があります) 動作します!

しかし

foo("gaga" false)   

(オプションの 2 番目の引数が FALSE であるため、"ELSE" を指定する必要があります!)

エラーになります:

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

これはバグですか??

以下の作品:

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

どうして???

助けてくれてありがとう!

(関数で動作します)

4

2 に答える 2

3

マクロでは、ARGV1 などは実際の CMake 変数ではありません。代わりに${ARGV1}、マクロ呼び出しからの文字列置換です。つまり、引数が 1 つだけの呼び出しは次のように展開されます。

if( NOT false AND )

エラーメッセージを説明しています。文字列展開を引用符で囲むと、次のようになります。

if( NOT "false" AND "")

IF コマンドに評価する空の文字列を指定します。その他の解決策: ${ARGC} 文字列置換を使用して、ARGV2 を展開する前に引数が存在するかどうかを判断します。または、おっしゃる通り、マクロではなく関数に切り替えます。関数では、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 に答える