CMake - 输入内部功能不会发生变化

时间:2018-06-01 15:01:30

标签: list function cmake

我正在尝试在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的内容没有改变。这里缺少什么?

1 个答案:

答案 0 :(得分:1)

考虑以下两行:

${_input_list}

set正在被其价值所取代。 one命令在此处执行的操作是在父作用域中创建变量one,因为_input_listfunction(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}而不是private void BtnSetContent_Click(object sender, EventArgs e) { string fn = @"C:\Users\User\Documents\보통 글자.rtf"; string towrite = ""; StreamReader sr = new StreamReader(fn); while (sr.Peek() >= 0) { towrite += sr.ReadLine() + " "; } sr.Close(); MessageBox.Show(towrite); RTBMainText.Rtf = towrite; }

最糟糕的字符串输入:(