2017-03-08 25 views
1

,其靈感來自迭代: https://cmake.org/cmake/help/v3.0/command/macro.htmlCMake的宏:如何在參數

我做的:

macro(ARGS_TEST) 
    message(WARNING "\nARGN: ${ARGN}\n") 
    foreach(arg IN LISTS ARGN) 
    message(WARNING "\n ARG : ${arg} \n") 
    endforeach() 
endmacro() 

ARGS_TEST(test 1 2 3) 

它打印:

ARGN: test;1;2;3 

但畢竟這沒什麼,這意味着迭代過ARGN似乎沒有發生。

我失蹤了嗎?

答到以下問題: Passing a list to a cmake macro

顯示如何打印參數作爲一個列表,而不是如何在他們

+0

你錯過了東西來自於foreach page,在宏內' ARGN' [不是普通變量](https://cmake.org/cmake/help/v3.7/command/macro.html)。關於克服這個列表看到這裏:http://stackoverflow.com/questions/5248749/passing-a-list-to-a-cmake-macro – Tsyvarev

+0

@Tsyvarev是的,但我正在從文檔的例子 - ;關於可能的重複,它似乎沒有回答我的問題,它將列表轉換爲一個字符串,而不是允許迭代它(或者我不明白答案?) – Vince

+0

'我正在遵循doc'中的示例 - 如果你談論最後一個例子,它在函數**中使用宏調用**。在這種情況下,宏從函數*中取* ARGN *變量*。仔細閱讀。但是,重複實際上是錯誤的,對不起。 – Tsyvarev

回答

0

Macro argument aren't variables迭代。所以在這種情況下,ARGN不會像其他列表一樣處理。我看到了解決此問題的兩種方法:

在您對示例的返工中,我將您的消息發送給STATUS消息以簡化測試。這應該與警告一起使用。

第一種方式是使這個功能:

function(ARGS_TEST_FUNCTION) 
    message(STATUS "\nARGN: ${ARGN}\n") 
    foreach(arg IN LISTS ARGN) 
    message(STATUS "\n ARG : ${arg} \n") 
    endforeach() 
endfunction() 

ARGS_TEST_FUNCTION(test 1 2 3) 

像這樣ARGN是一個變量,如預期的那樣擴大。如果你想在這個循環中設置值,你需要使用set和PARENT_SCOPE。如果您調用其他宏並且不知道它們打算設置的每個變量,則使用父範圍可能不可行。

或者我們可以做的擴展自己,並告訴在foreach我們傳遞一個列表:

macro(ARGS_TEST) 
    message(STATUS "\nARGN: ${ARGN}\n") 
    foreach(arg IN ITEMS ${ARGN}) 
    message(STATUS "\n ARG : ${arg} \n") 
    endforeach() 
endmacro() 

ARGS_TEST(test 1 2 3) 

這CMake的文檔