2014-06-19 19 views
55

The official document of CMake 2.8.12 dice di macroFunzione vs. Macro in CMake

Quando viene richiamato, i comandi registrati nella macro sono di prima modificato sostituendo parametri formali ($ {} arg1) con gli argomenti passati, e poi invocato come comandi normali.

giro function

Quando viene invocato, i comandi registrati nella funzione sono primo modificata sostituendo parametri formali ($ {arg1}) con gli argomenti passati, e quindi invocati come comandi normali.

Ovviamente, due citazioni sono quasi lo stesso, ma mi confonde. Sostituisce i parametri all'inizio quando si chiama una funzione come la macro?

+6

C'è almeno un'altra differenza importante, anche se abbastanza ovvia tra 'function' e' macro': la semantica di 'return()': quando usata in una 'macro', non si ritornerà dalla macro ma dalla funzione chiamante. –

+23

I documenti di CMake sono orribili quando si tenta di capirli. – stanleyli

risposta

59

Ho scritto un codice di esempio riportato di seguito

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}) 

e l'uscita è

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

Così sembra arg viene assegnato il valore di var quando la chiamata Foo e ${arg} sono solo stringa sostituita con ${var} quando chiama Moo.

Quindi penso che il due citazioni di cui sopra sono molto facili da fare uno confondere anche se i documenti ufficiali anche detto che

Sono sostituzioni stringa molto simile al C preprocessore farebbe con una macro. Se si desidera che le variabili CMake reali e/o il controllo dell'ambito CMake siano ottimali, è necessario controllare il comando della funzione.

+2

hai risposto alla tua stessa domanda nello stesso momento in cui l'hai creata (19 giugno 14 alle 2:48)? – robert

+0

L'ho dimenticato, ma penso che possa essere. –

+3

@robert La risposta alla tua domanda è consentita (un incoraggiamento) su SO: http://stackoverflow.com/help/self-answer –

25

In altre parole, la funzione spinge e si apre nuovo ambito variabile (variabili create e modificate esistono solo in funzione), macro no. Tuttavia, è possibile sovrascrivere il comportamento predefinito della funzione con il parametro PARENT_SCOPE del comando set.