2009-08-28 11 views

Respuesta

12

CMake no (AFAIK) verifica el número de variables pasadas a una macro, por lo que puede continuar y declararlo como cualquier otra macro.

También hay una variable ${ARGN} que se expande a una lista de todas las variables "restantes" pasadas a una macro, que pueden ser útiles.

actualización Como se indica en Sam 's comment, CMake ahora falla a menos que todos (con nombre) argumentos esperados se dan cuando se llama a una macro o función.

+5

Ahora sí parece cmake para comprobar si se pasan muy pocas variables. Esta respuesta ahora parece estar equivocada, o al menos está en mi cmake 2.8.8 – Sam

+2

Su macro aún puede tener "argumentos" opcionales, siempre y cuando no estén nombrados en la definición de la macro. Es decir, las personas que llaman pueden pasar argumentos adicionales que no fueron nombrados en la lista de argumentos de la macro. Su macro puede verificar estos argumentos adicionales usando '$ {ARGN}'. Cuidado: ARGN no es una variable cmake "normal". Para usarlo con el comando list(), primero deberá copiarlo en una variable normal: 'set (extra_macro_args $ {ARGN})'. Entonces puedes hacer cosas como 'list (LENGTH extra_macro_args num_extra_args)' seguido de 'if ($ {num_extra_args} MAYOR 0) yadayadayada' –

0

Esto ocurre de manera predeterminada si el argumento no se especifica como CMake no comprueba el número de parámetros requeridos para una macro.

29

Se requieren todos los argumentos nombrados en la definición de macro para las personas que llaman. Sin embargo, su macro aún puede aceptar argumentos opcionales siempre que no se mencionen explícitamente en la definición de la macro.

Es decir, las personas que llaman pueden pasar argumentos adicionales (que no se mencionaron en la lista de argumentos de la macro). Su macro puede verificar la existencia de tales argumentos adicionales al verificar la variable ${ARGN}.

Cuidado: ARGN no es una variable cmake "normal". Para utilizarlo con el comando list(), tendrá que copiar en una variable normal en primer lugar:

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) 
Cuestiones relacionadas