2017-03-08 1 views
1

inspiriert von: https://cmake.org/cmake/help/v3.0/command/macro.htmlCMake Makro: Wie über Argumente wiederholen

ich tun:

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) 

die druckt:

ARGN: test;1;2;3 

aber nichts danach, was bedeutet, Iteration über ARGN scheint nicht zu passieren.

Alles, was ich vermisse?

Antwort auf folgende Frage: Passing a list to a cmake macro

zeigt, wie die Argumente als Liste zu drucken, aber nicht, wie über sie

+0

Sie das Ding verpassen, dass in einem Makro ' ARGN' ist [keine normale Variable] (https://cmake.org/cmake/help/v3.7/command/macro.html). Um dies für Listen zu überwinden, siehe hier: http://StackOverflow.com/Questions/5248749/Passing-As-List-To-A-Make-Macro – Tsyvarev

+0

@Tsyvarev yep, aber ich folge dem Beispiel aus dem Doc -; Über das mögliche Duplikat scheint es meine Frage nicht zu beantworten, es wirft die Liste auf eine Zeichenkette, anstatt zu erlauben, darüber zu iterieren (oder ich habe die Antwort nicht verstanden?) – Vince

+0

'Ich folge dem Beispiel vom Dokument' - Wenn Sie über das letzte Beispiel sprechen, verwendet es den Makroaufruf ** innerhalb der Funktion **. In diesem Fall nimmt das Makro * ARGN * variable * von der Funktion *. Lies es sorgfältig. Aber das Duplikat ist falsch für Ihren Fall, tut mir leid. – Tsyvarev

Antwort

0

Macro argument aren't variables iterieren. So wird ARGN in diesem Zusammenhang nicht wie andere Listen behandelt. Ich sehe zwei Möglichkeiten, um dieses Problem zu umgehen:

In meinen Überarbeitungen Ihrer Proben habe ich Ihre Nachrichten STATUS Nachrichten, um meine Tests zu erleichtern. Dies sollte auch mit WARNUNG funktionieren.

Der erste Weg dies eine Funktion zu machen ist:

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) 

Gefällt Ihnen dieses ARGN ist eine Variable und wird als erwartet erweitert. Wenn Sie in dieser Schleife Werte festlegen wollten, müssen Sie set und PARENT_SCOPE verwenden. Das Verwenden des übergeordneten Bereichs ist möglicherweise nicht möglich, wenn Sie andere Makros aufrufen und nicht alle Variablen kennen, die sie festlegen möchten.

Alternativ können wir die Expansion selbst tun und sagen, die foreach wir eine Liste sind vorbei:

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) 

Das kam aus dem foreach page in der CMake Dokumentation

Verwandte Themen