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 两个参数