[CMake entrée et avancé (14)] La portée des variables dans CMake (avec code)

        Comme le langage C, dans cmake, les variables ont également le concept de portée.Dans cet article, nous parlerons de la portée des variables dans cmake.

        Pour la portée de la fonction, lorsque la variable var est liée à la portée de la fonction actuelle via set dans la fonction, la variable var n'est valide dans la portée de la fonction, en dehors de cette portée, que s'il existe une variable var portant le même nom en dehors de cette portée , alors use sera la variable var avec le même nom en dehors du domaine; func1() appelle en interne func2(), et si la fonction imbriquée func2() fait également référence à la variable var, alors la variable var devrait être la variable définie à l'intérieur de func1 (), le cas échéant ; S'il n'y a pas de variable liée var à l'intérieur de func1(), alors la variable var définie en dehors de la portée de func1() sera utilisée pour rechercher vers l'extérieur à son tour.

        Le passage ci-dessus peut ne pas être facile à comprendre pour vous. Examinons la portée de la fonction à travers quelques exemples.

        ①. La fonction fait référence en interne à la variable définie en dehors de la fonction

        L'exemple de code est le suivant :

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

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

xyz() # 调用函数

        ABC est une variable définie en dehors de la fonction, qui est référencée dans la fonction xyz, et les informations imprimées sont les suivantes :

         Ainsi, on peut voir que les variables définies en dehors de la fonction peuvent être référencées dans la fonction.

        ②. Si les variables définies dans la fonction peuvent être référencées en externe

# 函数 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 définie dans la fonction. Une fois la fonction appelée en externe, utilisez if(DEFINED ABC) pour déterminer si la variable ABC est définie. Si la variable est définie, imprimez true et imprimez la variable. Si la variable n'est pas défini, imprimer faux. Les résultats des tests sont les suivants :

         Par conséquent, on peut voir que les variables définies à l'intérieur de la fonction ne peuvent être utilisées qu'à l'intérieur de la fonction et sont invalides après la libération de la fonction. Ceci est en fait similaire au langage C. Les variables définies dans la fonction peuvent être considérées comme locales variables, et ne peuvent naturellement pas être référencées à l'extérieur.

        ③.Définir une variable avec le même nom que l'extérieur dans la fonction

        Le code de test ressemble à ceci :

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

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

        Dans ce code, nous définissons la variable ABC="Hello World!" en dehors de la fonction et définissons la variable ABC="Hello China!" à l'intérieur de la fonction. Une fois la fonction exécutée, appelez message() en externe pour imprimer la variable ABC . Selon la compréhension du langage C, la valeur de la variable ABC imprimée en dehors de la fonction doit être égale à "Hello China!" (Ne faites pas attention à savoir si la définition de la variable doit être placée avant la définition de la fonction. Ce concept est déclaré dans le langage, bien que la fonction soit définie, mais la fonction est appelée après la définition de la variable), mais ce n'est pas le cas, regardons les informations d'impression :

         D'après les informations imprimées, nous pouvons voir que le fait n'est pas ce que nous avons supposé ci-dessus. L'appel de set dans la fonction pour définir la variable ABC ne définit pas la valeur de la variable externe ABC, mais crée une nouvelle variable ABC dans la fonction, qui est différent du langage C. Oui, il est très similaire à Python, si vous avez appris Python, vous devriez le savoir.

        Par conséquent, dans le code à l'intérieur de la fonction, avant d'appeler set, la variable ABC est référencée. A ce moment, il cherchera si la variable est définie dans la fonction. Le premier message imprimé à l'intérieur est "Hello World!"; après avoir appelé set , une variable ABC est également créée dans la fonction, et à ce moment, se référer à nouveau à ABC utilisera la variable définie dans la fonction au lieu de la variable définie à l'extérieur, donc le premier Les deux messages imprimés sont "Hello China!".

        ④ Comment définir des variables définies en externe dans la fonction

        Et si vous deviez modifier les variables définies en externe dans la fonction ? Par exemple, le code suivant :

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

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

        De l'introduction précédente, nous pouvons voir que la fonction xyz() ne crée qu'une variable ABC utilisée à l'intérieur de la fonction via set, au lieu de modifier la variable ABC définie en externe, alors comment la fonction peut-elle modifier la variable définie en externe ? ? En fait, c'est aussi très simple.La commande set fournit une option facultative PARENT_SCOPE, il suffit d'ajouter le mot-clé PARENT_SCOPE à la fin de la liste des paramètres lors de l'appel de la commande set, comme indiqué ci-dessous :

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

         Regardez à nouveau les informations d'impression :

         L'impression des informations prouve qu'il est bien possible d'ajouter PARENT_SCOPE, alors qu'est-ce que l'option PARENT_SCOPE ? L'explication officielle est la suivante : si l'option PARENT_SCOPE est ajoutée, la variable sera définie dans la portée au-dessus de la portée actuelle, et chaque répertoire (ici "répertoire" fait référence à celui qui contient le répertoire CMakeLists.txt) ou fonction créera un nouvelle portée, cette commande définira la valeur de la variable sur le répertoire parent ou la fonction d'appel supérieure.

        ⑤ Comment réaliser la valeur de retour de la fonction ?

        Lorsque je vous ai présenté la fonction, j'ai mentionné que la fonction dans cmake peut également avoir une valeur de retour, mais elle ne peut pas être réalisée via la commande return (). Puisque PARENT_SCOPE n'a pas été introduit à ce moment-là, il est impossible d'expliquer comment réaliser la valeur de retour. Maintenant, nous connaissons déjà la fonction de l'option PARENT_SCOPE. En fait, cette option est utilisée pour réaliser la fonction de valeur de retour de la fonction.

        Regardons d'abord un exemple :

# 顶层 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}")

        Les résultats imprimés sont les suivants :

         En voyant cela, je ne sais pas si tout le monde le comprend. C'est en fait très simple. Lors de l'appel de la fonction xyz(), le out_var transmis est transmis en tant que paramètre, pas en tant que nom de variable, mais il doit maintenant être modifié en un nom de variable. Comment faire ? C'est-à-dire pour obtenir la valeur du paramètre out dans la fonction, utiliser la valeur du paramètre out comme nom de variable, puis créer la variable avec set et ajouter l'option PARENT_SCOPE. Ainsi, la variable peut être imprimée via le message, car cette variable est définie dans le code source.


        À propos de cmake, l'auteur vous a présenté tellement de choses, ce qui est fondamentalement suffisant ; en fait, il y a encore de nombreuses commandes et variables qui n'ont pas été introduites, mais vous pouvez les regarder vous-même, puis passer au test de combat réel !

        Cette colonne est terminée ~

Je suppose que tu aimes

Origine blog.csdn.net/cj_lsk/article/details/131348993
conseillé
Classement