我正在尝试在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
的内容没有改变。这里缺少什么?
答案 0 :(得分:1)
考虑以下两行:
${_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}
而不是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;
}
。
最糟糕的字符串输入:(