CMake - вход не изменяется внутри функции - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь написать функцию в CMake, которая возьмет список и обновит его так, чтобы к каждому элементу в списке добавлялась дополнительная строка.

Мой код соответствует следующим(примерно на основе ответа на предыдущий вопрос здесь ):

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 голосов
/ 01 июня 2018

Рассмотрим эти две строки:

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}.

Строковое печатание в худшем виде: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...