跳到主要内容

z_kmpkg_function_arguments

注意

这是 kmpkg内部用于实现核心逻辑的辅助函数。 其行为和参数可能会以不兼容的方式突发变更,且无任何通知。 请勿在自定义端口中使用该函数

获取一组参数列表,使其能够“完美转发”(perfect forwarding)到另一个函数中,解决 CMake 原生 ARGV 无法区分嵌套列表参数的问题。

用法

z_kmpkg_function_arguments(<out-var> [<N>])

参数说明

<out-var>

必填参数,指定用于存储参数列表的输出变量名称(该变量会被赋值为处理后的参数列表)。

<N>

可选参数,指定开始累积参数的索引(从 0 开始计数)。 默认值为 0,即收集函数接收到的所有参数。

核心说明

该宏(macro)相比 CMake 原生的 ARGV 变量的核心优势是:能够正确区分包含内部分号的列表参数(避免嵌套列表被错误拆分)。

CMake 原生的 ARGV 会将所有参数按分号拼接,无法区分“多个独立参数”和“单个列表参数”;而该函数会对列表参数中的分号进行转义,确保转发时参数结构不丢失。

调用形式原生 ARGV 结果z_kmpkg_function_arguments() 结果说明
fun(A B)"A;B""A;B"两个独立参数,结果一致
fun("A;B")"A;B""A\;B"单个列表参数,分号被转义

注:转义后的 A\;B 在转发给其他函数时,会被正确识别为“单个包含分号的参数”,而非“两个独立参数 A 和 B”。

示例(仅作内部逻辑参考)

以下示例展示了该函数的典型场景:封装一个已废弃的函数,将其参数完美转发到新函数中,同时保留参数的原始结构。

# 已废弃的旧函数
function(fun)
# 获取完美转发的参数列表
z_kmpkg_function_arguments(ARGS)
# 输出废弃提示
message("fun() is deprecated, use fun_replacement()")
# 将参数完美转发到新函数
fun_replacement(${ARGS})
endfunction()

# 新的替代函数
function(fun_replacement)
# 打印接收到的参数(验证结构是否保留)
message("Received arguments: ${ARGV}")
endfunction()

# 测试调用:传递单个列表参数
fun("A;B")
# fun_replacement 会接收到 "A;B"(单个参数),而非 A、B 两个参数

源码

scripts/cmake/z_kmpkg_function_arguments.cmake