You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake函数调用时如何实现参数追加而非覆盖?

解决CMake mic_set_classes函数参数追加问题

原函数每次调用都会直接覆盖全局属性GLOBAL_ALL_CLASS,没有读取原有内容进行追加,导致最终只保留最后一次传入的参数。以下是修正后的实现:

function(mic_set_classes)
    set(oneValueArgs CLASS_TYPE)
    set(multiValueArgs CLASS_LIST)
    cmake_parse_arguments(MIC_SET_CLASSES "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    # 获取全局属性中已有的类列表
    get_property(existing_classes GLOBAL PROPERTY GLOBAL_ALL_CLASS)
    if(NOT existing_classes)
        set(existing_classes "")
    endif()

    # 将本次传入的CLASS_LIST转为逗号分隔字符串
    set(new_classes "")
    foreach(A IN LISTS MIC_SET_CLASSES_CLASS_LIST)
        string(APPEND new_classes "${A},")
    endforeach()
    # 移除末尾多余的逗号(若后续命令允许末尾逗号,可删除此步)
    string(REGEX REPLACE ",$" "" new_classes "${new_classes}")

    # 拼接已有内容与新内容
    if(existing_classes AND new_classes)
        set(all_list_types "${existing_classes},${new_classes}")
    elseif(new_classes)
        set(all_list_types "${new_classes}")
    else()
        set(all_list_types "${existing_classes}")
    endif()

    # 更新全局属性
    set_property(GLOBAL PROPERTY GLOBAL_ALL_CLASS ${all_list_types})
endfunction()

# 原解析函数保持不变
function(mic_parse_project)
    get_property(class_list GLOBAL PROPERTY GLOBAL_ALL_CLASS)
    execute_process(COMMAND ${MIC_PARSE_PROJECT_INVMNG} -c ${class_list})
endfunction()

关键修改说明

  1. 读取已有全局属性:每次调用函数时先获取GLOBAL_ALL_CLASS的当前值,确保不会丢失之前传入的参数
  2. 简化参数处理逻辑:删除原代码中冗余的外层foreach循环,直接遍历本次传入的CLASS_LIST生成逗号分隔字符串
  3. 安全追加逻辑:判断已有内容和新内容是否为空,避免出现多余逗号或空值
  4. 可选末尾逗号处理:通过正则替换移除末尾多余逗号,适配多数命令对参数格式的要求

内容的提问来源于stack exchange,提问作者Sarang Bilwankar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:25:52