cmake宏中的可选参数

ami*_*mit 20 cmake

我想创建一个参数是可选的宏.如果未指定,则参数的值应为空字符串.我怎样才能做到这一点?谢谢你的帮助.

Stu*_*erg 39

调用者需要您的宏定义指定的任何参数.但是,只要宏未在宏定义中明确命名,您的宏仍然可以接受可选参数.

也就是说,允许调用者传入额外的参数(在宏的参数列表中没有命名).您的宏可以通过检查${ARGN}变量来检查是否存在此类额外参数.

注意:ARGN不是"正常"的cmake变量.要在list()命令中使用它,您需要先将其复制到普通变量中:

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)
Run Code Online (Sandbox Code Playgroud)


Jes*_*erE 15

CMake不会(AFAIK)检查传递给宏的变量数量,因此您可以继续将其声明为任何其他宏.

还有一个变量${ARGN}扩展为传递给宏的所有"剩余"变量的列表,这可能很有用.

更新Sam评论中所述,除非在调用宏或函数时给出所有预期(命名)参数,否则CMake现在会失败.

  • 现在cmake似乎确实检查是否传递的变量太少.这个答案现在看来是错误的,或者至少是我的cmake 2.8.8 (6认同)
  • 只要宏没有在宏定义中命名,您的宏仍然可以有可选的"参数".也就是说,允许调用者传入宏参数列表中未命名的额外参数.您的宏可以使用`$ {ARGN}`检查这些额外的参数.注意:ARGN不是"正常"的cmake变量.要将它与list()命令一起使用,首先需要将其复制到普通变量中:`set(extra_macro_args $ {ARGN})`.然后你可以做一些事情,比如`list(LENGTH extra_macro_args num_extra_args)`然后`if($ {num_extra_args} GREATER 0)yadayadayada` (2认同)