2014-06-19 13 views
55

The official document of CMake 2.8.12 mówi o macroFunkcja vs. Makro w CMake

Kiedy jest wywoływana, polecenia zapisane w makro są najpierw zmodyfikowany poprzez zastąpienie parametrów formalnych ($ {arg1}) z argumentami minęły, a następnie wywoływane jako normalne polecenia.

io function

Po wywołaniu, polecenia rejestrowane w funkcji są przede zmodyfikowane przez zastąpienie parametrów formalnych ($ {arg1}) z argumentami test wypadł pozytywnie, a następnie wywoływana w normalne polecenia.

Oczywiście dwa cytaty są prawie takie same, ale mylą mnie. Czy zastępuje parametry na początku podczas wywoływania funkcji, podobnie jak makro?

+6

Istnieje co najmniej jedna ważna, choć dość oczywista różnica między 'function' i' macro': semantyką 'return()': Kiedy jest używana w 'makrze', nie powrócisz z makra, ale z funkcji wywołującej. –

+23

Dokumenty CMake są okropne, gdy próbujesz je zrozumieć. – stanleyli

Odpowiedz

59

Napisałem kod przykładowy poniżej

set(var "ABC") 

macro(Moo arg) 
    message("arg = ${arg}") 
    set(arg "abc") 
    message("# After change the value of arg.") 
    message("arg = ${arg}") 
endmacro() 
message("=== Call macro ===") 
Moo(${var}) 

function(Foo arg) 
    message("arg = ${arg}") 
    set(arg "abc") 
    message("# After change the value of arg.") 
    message("arg = ${arg}") 
endfunction() 
message("=== Call function ===") 
Foo(${var}) 

i wyjście jest

=== Call macro === 
arg = ABC 
# After change the value of arg. 
arg = ABC 
=== Call function === 
arg = ABC 
# After change the value of arg. 
arg = abc 

Więc wydaje arg jest przypisana wartość var gdy wezwanie Foo i ${arg} to tylko ciąg zastąpić ${var} kiedy zadzwoń pod numer Moo.

Więc myślę, że powyższe dwa cytaty są bardzo łatwe do wykonania jednego mylić chociaż oficjalne dokumenty, powiedział również, że

Są zamienniki strunowe dużo jak preprocesor C zrobi z makro. Jeśli chcesz mieć prawdziwe zmienne CMake i/lub lepsze sterowanie zasięgiem CMake , powinieneś spojrzeć na polecenie funkcji.

+2

czy odpowiedziałeś na własne pytanie w tym samym momencie, w którym je stworzyłeś (19 czerwca 14 o 2:48)? – robert

+0

Zapomniałem o tym, ale myślę, że może tak być. –

+3

@robert Odpowiadanie na twoje własne pytanie jest dozwolone (zachęcane) na SO: http://stackoverflow.com/help/self-answer –

25

Innymi słowy, funkcja wypycha i wyświetla nowy zakres zmiennych (zmienne utworzone i zmienione istnieją tylko w funkcji), makro nie. Można jednak zastąpić domyślne zachowanie funkcji za pomocą parametru PARENT_SCOPE komendy set.