Voglio creare una macro il cui argomento è facoltativo. Se non specificato, il valore dell'argomento dovrebbe essere una stringa vuota. Come posso fare questo? Grazie per l'aiuto.Argomento facoltativo nella macro cmake
risposta
CMake non controlla (AFAIK) il numero di variabili passate a una macro, quindi è possibile procedere e dichiararlo come qualsiasi altra macro.
C'è anche una variabile ${ARGN}
che si espande in un elenco di tutte le variabili "rimanenti" passate a una macro, che può essere utile.
Aggiornamento Come indicato nel Sam s' comment, CMake ora non riesce a meno che tutti gli argomenti previsti (nome) sono dati quando si chiama una macro o funzione.
Questo accade per impostazione predefinita se l'argomento non è specificato poiché CMake non controlla il numero di parametri richiesti per una macro.
Eventuali argomenti denominati nella definizione macro sono necessari per i chiamanti. Tuttavia, la macro può ancora accettare argomenti facoltativi purché non vengano esplicitamente denominati nella definizione di macro.
Cioè, i chiamanti sono autorizzati a passare argomenti extra (che non sono stati nominati nella lista degli argomenti della macro). La tua macro può verificare l'esistenza di tali argomenti extra controllando la variabile ${ARGN}
.
Attenzione: ARGN
non è una variabile "normale" cmake. Per usarlo con il comando list()
, è necessario copiarlo in una variabile normale prima:
macro (mymacro required_arg1 required_arg2)
# Cannot use ARGN directly with list() command,
# so copy it to a variable first.
set (extra_macro_args ${ARGN})
# Did we get any optional args?
list(LENGTH extra_macro_args num_extra_args)
if (${num_extra_args} GREATER 0)
list(GET extra_macro_args 0 optional_arg)
message ("Got an optional arg: ${optional_arg}")
endif()
endmacro (mymacro)
- 1. Argomento facoltativo per ciascun argomento posizionale
- 2. Argomento facoltativo seguito da Params
- 3. Argomento facoltativo prima in JavaScript
- 4. Funzione vs. Macro in CMake
- 5. Strano "Argomento non facoltativo" l'errore in VBA
- 6. Argomento facoltativo in Drupal implementazione hook_menu
- 7. Definizione macro preprocessore tramite cmake
- 8. SP con hash e facoltativo argomento scalare
- 9. CMake: come passare le macro del preprocessore
- 10. Scrittura di uno script Fish Shell con un argomento facoltativo
- 11. argparse - richiede 2 valori o nessuno per un argomento facoltativo
- 12. Come passare modelli multi-argomento a macro?
- 13. XPath con elemento facoltativo nella gerarchia
- 14. Attributo di espressione facoltativo nella direttiva AngularJS
- 15. Carattere facoltativo nella maschera di immissione
- 16. Sostituzione delle macro nella direttiva #include
- 17. EndInvoke() è facoltativo, di tipo facoltativo o sicuramente non facoltativo?
- 18. Cambia caso di argomento fornito a macro preprocessore C
- 19. Come verificare se esiste una macro in CMake
- 20. Doxygen - dichiarare parametro come facoltativo
- 21. Parametro facoltativo nel cetriolo
- 22. QT5 migrazione e Boost: if.hpp: errore Macro disallineamento argomento
- 23. Argomento della macro Concat con spazio dei nomi
- 24. CMake regex partita directory nella lista
- 25. Come generare un'intestazione nella sorgente con cmake?
- 26. macro "AM_PATH_CPPUNIT" non trovata nella libreria
- 27. Perché tante parentesi nella macro SUCCEEDED?
- 28. Come concatenare numero in stringa nella macro?
- 29. Qual è il punto dell'opzione Sphinx highlight_language config se code-block :: non ha un argomento facoltativo?
- 30. CMake ... ccmake o cmake?
Ora CMake viene visualizzata per controllare se sono passati troppo pochi variabile. Questa risposta ora sembra essere sbagliata, o almeno è sul mio cmake 2.8.8 – Sam
La tua macro può ancora avere "argomenti" opzionali purché non siano nominati nella definizione della macro. Cioè, i chiamanti sono autorizzati a passare argomenti extra che non sono stati nominati nella lista degli argomenti della macro. La tua macro può controllare questi argomenti extra usando '$ {ARGN}'. Attenzione: ARGN non è una variabile cmake "normale". Per usarlo con il comando list(), devi prima copiarlo in una variabile normale: 'set (extra_macro_args $ {ARGN})'. Quindi puoi fare cose come 'lista (LENGTH extra_macro_args num_extra_args)' seguita da 'if ($ {num_extra_args} MAGGIORE 0) yadayadayada' –