【问题标题】:CMake - input does not change inside functionCMake - 输入在函数内部不会改变
【发布时间】:2018-06-01 15:01:30
【问题描述】:

我正在尝试在 CMake 中编写一个函数,该函数将获取一个列表,并对其进行更新,以便列表中的每个项目都附加一个字符串。

我的代码大致如下(大致基于对上一个问题here 的回答):

function(prepend_number _input_list)
    set(_new_list "")
    foreach(_item ${_input_list})
        list(APPEND _new_list "number_${_item}")
    endforeach()

    message(STATUS "Input: ${_input_list}")
    message(STATUS "Ammended list: ${_new_list}")

    set(${_input_list} "${_new_list}" PARENT_SCOPE)
    message(STATUS "Revised input: ${_input_list}")
endfunction() 

set(numbers one two three four five)

prepend_number("${numbers}")

由此我得到以下输出:

Input: one;two;three;four;five
Ammended list: number_one;number_two;number_three;number_four;number_five
Output: one;two;three;four;five

我对此感到困惑。为什么_input_list的值不等于_new_list的值?

如果我添加一行额外的代码来显示函数外部的数字内容(即message(STATUS "${numbers}"))我会得到类似的结果,numbers 的内容没有改变。这里缺少什么?

【问题讨论】:

    标签: list function cmake


    【解决方案1】:

    考虑这两行:

    set(${_input_list} "${_new_list}" PARENT_SCOPE)
    message(STATUS "Revised input: ${_input_list}")
    

    ${_input_list} 被替换为它的值。 set 命令在这里所做的是在父范围内创建变量 one,因为 one_input_list 的第一个元素。

    为了修改原始列表,你需要传递它的名字,而不是值:

    function(prepend_number _list_var)
    
        foreach(_item ${${_list_var}})
            list(APPEND _new_list "number_${_item}")
        endforeach()
    
        message(STATUS "Input var: ${_list_var}")
        message(STATUS "Input: ${${_list_var}}")
    
        set(${_list_var} "${_new_list}" PARENT_SCOPE)
    endfunction() 
    
    set(numbers one two three four five)
    
    set(numbers "5" "6" "7")
    prepend_number(numbers)
    message(STATUS "${numbers}")
    

    请注意,上面的_list_var 是一个包含原始变量名称的字符串,而不是它的值。出于这个原因,我使用${${_list_var}} 语法来访问元素。

    出于同样的原因,在调用prepend_numbers 时,我传递的是numbers 而不是${numbers}

    最糟糕的字符串类型:(

    【讨论】:

    • 这真的很有帮助,谢谢!我之前一直看到 ${${variable}} 符号,并认为我遗漏了一些东西,现在我明白了为什么。
    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多