【问题标题】:Optional Argument in cmake macrocmake 宏中的可选参数
【发布时间】:2009-08-28 12:32:16
【问题描述】:

我想创建一个参数是可选的宏。如果未指定,则参数的值应为空字符串。我该怎么做?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    调用者需要在宏定义中命名的任何参数。但是,您的宏仍然可以接受可选参数,只要它们没有在宏定义中明确命名。

    也就是说,调用者可以传入extra 参数(未在宏的参数列表中命名)。您的宏可以通过检查 ${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 (variadic_args ${ARGN})
        
        # Did we get any optional args?
        list(LENGTH variadic_args variadic_count)
        if (${variadic_count} GREATER 0)
            list(GET variadic_args 0 optional_arg)
            message ("Got an optional arg: ${optional_arg}")
        endif ()
    endmacro (mymacro)
    

    【讨论】:

      【解决方案2】:

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

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

      更新 正如Samcomment 中所述,CMake 现在会失败,除非在调用宏或函数时给出所有预期的(命名的)参数。

      【讨论】:

      • 现在 cmake 确实会检查是否传递了太少的变量。这个答案现在似乎是错误的,或者至少它在我的 cmake 2.8.8 上
      • 您的宏仍然可以有可选的“参数”,只要它们没有在宏定义中命名。也就是说,允许调用者传入未在宏的参数列表中命名的额外参数。您的宏可以使用${ARGN} 检查这些额外的参数。注意:ARGN 不是“正常”的 cmake 变量。要将其与 list() 命令一起使用,您需要先将其复制到一个普通变量中:set(extra_macro_args ${ARGN})。然后您可以执行list(LENGTH extra_macro_args num_extra_args) 后跟if( ${num_extra_args} GREATER 0) yadayadayada 之类的操作
      【解决方案3】:

      如果未指定参数,则默认情况下会发生这种情况,因为 CMake 不检查宏所需的参数数量。

      【讨论】:

        猜你喜欢
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多