[Entrada de CMake y avanzada (14)] El alcance de las variables en CMake (con código)

        Al igual que el lenguaje C, en cmake las variables también tienen el concepto de alcance, en este artículo hablaremos sobre el alcance de las variables en cmake.

        Para el alcance de la función, cuando la variable var está vinculada al alcance de la función actual a través del conjunto en la función, la variable var solo es válida en el alcance de la función, fuera de este alcance, si hay una variable var con el mismo nombre fuera de este alcance , entonces se usará la variable var con el mismo nombre fuera del dominio; func1() llama internamente a func2(), y si la función anidada func2() también hace referencia a la variable var, entonces la variable var debería ser la variable definida dentro de func1 (), si existe; Si no hay una variable vinculada var dentro de func1(), entonces la variable var definida fuera del alcance de func1() se usará para buscar hacia afuera a su vez.

        El pasaje anterior puede no ser fácil de entender para usted. Echemos un vistazo al alcance de la función a través de algunos ejemplos.

        ① La función internamente se refiere a la variable definida fuera de la función

        El código de ejemplo es el siguiente:

# 函数 xyz
function(xyz)
    message(${ABC}) #引用变量 ABC
endfunction()

set(ABC "Hello World") #定义变量 ABC

xyz() # 调用函数

        ABC es una variable definida fuera de la función, a la que se hace referencia en la función xyz, y la información impresa es la siguiente:

         Entonces se puede ver que las variables definidas fuera de la función se pueden referenciar dentro de la función.

        ② Si las variables definidas en la función pueden ser referenciadas externamente

# 函数 xyz
function(xyz)
    set(ABC "Hello World")#定义变量 ABC
endfunction()

xyz() # 调用函数

if(DEFINED ABC)
    message("true")
    message("${ABC}") #引用函数内定义的变量 ABC
else()
    message("false")
endif()

        La variable ABC está definida en la función. Después de llamar externamente a la función, use if(DEFINED ABC) para juzgar si la variable ABC está definida. Si la variable está definida, imprima verdadero e imprima la variable. Si la variable no lo está definido, imprimir falso. Los resultados de la prueba son los siguientes:

         Por lo tanto, se puede ver que las variables definidas dentro de la función solo se pueden usar dentro de la función y no son válidas después de que se libera la función. Esto es similar al lenguaje C. Las variables definidas en la función se pueden considerar como locales. variables, y naturalmente no pueden ser referenciadas fuera.

        ③ Defina una variable con el mismo nombre que el exterior en la función

        El código de prueba se ve así:

# 函数 xyz
function(xyz)
    message("函数内部")
    message("${ABC}")
    set(ABC "Hello China!")#设置变量 ABC
    message("${ABC}")
endfunction()

set(ABC "Hello World!")#定义变量 ABC
xyz() # 调用函数
message("函数外部")
message("${ABC}")

        En este código, definimos la variable ABC="¡Hola mundo!" fuera de la función y configuramos la variable ABC="¡Hola, China!" dentro de la función. Después de ejecutar la función, llame a message() externamente para imprimir la variable ABC . De acuerdo con el entendimiento en el lenguaje C, el valor de la variable ABC impresa fuera de la función debe ser igual a "¡Hola, China!" (No preste atención a si la definición de la variable debe colocarse antes de la definición de la función. Este concepto está declarado en el lenguaje, aunque se define la función, pero se llama a la función después de definir la variable), pero no es así, echemos un vistazo a la información de impresión:

         A partir de la información impresa, podemos ver que el hecho no es lo que asumimos anteriormente. Llamar a set en la función para establecer la variable ABC no establece el valor de la variable externa ABC, sino que crea una nueva variable ABC en la función, que es diferente al lenguaje C. Sí, es muy similar a Python, si has aprendido Python, deberías conocerlo.

        Por lo tanto, en el código dentro de la función, antes de llamar a set, se referencia la variable ABC. En este momento, buscará si la variable está definida en la función. El primer mensaje impreso dentro es "¡Hola mundo!"; después de llamar a set , también se crea una variable ABC en la función, y en este momento, haciendo referencia a ABC nuevamente, se utilizará la variable definida en la función en lugar de la variable definida fuera, por lo que los dos primeros mensajes impresos son "¡Hola, China!".

        ④ Cómo establecer variables definidas externamente en la función

        Entonces, ¿qué sucede si necesita modificar las variables definidas externamente dentro de la función? Por ejemplo, el siguiente código:

# 函数 xyz
function(xyz)
    set(ABC "Hello China!")
endfunction()

set(ABC "Hello World!")
xyz() # 调用函数
message("${ABC}")

        De la introducción anterior, podemos ver que la función xyz() solo crea una variable ABC utilizada dentro de la función a través de set, en lugar de modificar la variable ABC definida externamente, entonces, ¿cómo puede la función modificar la variable definida externamente? De hecho, también es muy simple. El comando set proporciona una opción opcional PARENT_SCOPE, simplemente agregue la palabra clave PARENT_SCOPE al final de la lista de parámetros cuando llame al comando set, como se muestra a continuación:

# 函数 xyz
function(xyz)
    set(ABC "Hello China!" PARENT_SCOPE) #加上 PARENT_SCOPE
endfunction()
set(ABC "Hello World!")
xyz() # 调用函数
message("${ABC}")

         Mire la información de impresión nuevamente:

         La información de impresión prueba que sí es posible agregar PARENT_SCOPE, entonces, ¿cuál es la opción PARENT_SCOPE? La explicación oficial es esta: si se agrega la opción PARENT_SCOPE, la variable se establecerá en el ámbito por encima del ámbito actual, y cada directorio (aquí "directorio" se refiere al que contiene el directorio CMakeLists.txt) o función creará un nuevo alcance, este comando establecerá el valor de la variable en el directorio principal o en la función de llamada superior.

        ⑤ ¿Cómo realizar el valor de retorno de la función?

        Cuando les presenté la función, mencioné que la función en cmake también puede tener un valor de retorno, pero no se puede realizar a través del comando return(). Dado que PARENT_SCOPE no se introdujo en ese momento, es imposible explicar cómo realizar el valor de retorno. Ahora ya conocemos la función de la opción PARENT_SCOPE. De hecho, esta opción se utiliza para realizar la función de valor de retorno de la función.

        Veamos primero un ejemplo:

# 顶层 CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(TEST)

# 定义一个函数 xyz
# 实现两个数相加,并将结果通过 out 参数返回给调用者
function(xyz out var1 var2)
    math(EXPR temp "${var1} + ${var2}")
    set(${out} ${temp} PARENT_SCOPE)
endfunction()
xyz(out_var 5 10)
message("${out_var}")

        Los resultados impresos son los siguientes:

         Al ver esto, no sé si todos lo entienden. En realidad, es muy simple. Al llamar a la función xyz(), el out_var pasado se pasa como un parámetro, no como un nombre de variable, pero ahora debe cambiarse a un nombre de variable ¿Cómo hacerlo? Es decir, para obtener el valor del parámetro out en la función, use el valor del parámetro out como el nombre de la variable y luego cree la variable con set y agregue la opción PARENT_SCOPE. Entonces, la variable se puede imprimir a través del mensaje, porque esta variable está definida en el código fuente.


        Acerca de cmake, el autor te ha presentado mucho, lo cual es básicamente suficiente; de ​​hecho, todavía hay muchos comandos y variables que no se han introducido, pero puedes verlo tú mismo y luego ir a la prueba de combate real.

        Esta columna ha terminado~

Supongo que te gusta

Origin blog.csdn.net/cj_lsk/article/details/131348993
Recomendado
Clasificación