美文网首页
CMake之function命令介绍

CMake之function命令介绍

作者: Domibaba | 来源:发表于2023-09-07 12:18 被阅读0次

function()命令用于创建一个函数,一旦创建,后续可以当做独立的命令使用。

命令格式

function(<name> [<arg1> ...])
<commands>
endfunction()

  • name

    函数名称,可以通过函数名(参数)形式对函数进行调用。

  • [<arg1> ...]

    函数参数。

  • <commands>

    函数内部的语句或命令,在函数定义的时候只会被记录而不会执行,当函数被调用时才执行。

endfunction()也有一个可选的参数,就是函数名称,如果使用的话必须要与function()中定义的名称完全一致,默认会自动填写。

当定义一个函数时,也会创建一个范围,function内创建的普通变量范围默认仅限于该fcuntion,也可以使用set(var PARENT_SCOPE)将创建的变量传递到调用者的范围。

使用命令

  • 定义一个简单的函数

    # CMakeLists.txt
    cmake_minimum_required(VERSION 3.22)
    project(function_test)
    
    
    # 定义一个函数,接受2个入参,并将入参打印出来
    function(print var1 var2)
        message("-- Hello: [${var1}] and [${var2}]")
    endfunction()
    
    print("function" "test")
    

    执行cmake .后的结果:

    -- Hello: [function] and [test]
    
  • 在定义的函数内使用上层定义的变量

    # CMakeLists.txt
    cmake_minimum_required(VERSION 3.22)
    project(function_test)
    
    set(VAR1_IN_PARENT_SCOPE "parent var1")
    
    # 定义一个函数,接受2个入参,并将入参打印出来
    function(print var1 var2)
        message("-- Hello: [${var1}] and [${var2}]")
        message("-- show parent var: ${VAR2_IN_PARENT_SCOPE}")
    endfunction()
    
    print("function test" "first time")
    
    set(VAR2_IN_PARENT_SCOPE "parent var2")
    print("function test" "sencond time")
    

    执行cmake .后的结果:

    -- Hello: [function test] and [first time]
    -- show parent var: 
    -- Hello: [function test] and [sencond time]
    -- show parent var: parent var2
    

    说明只要在调用fcuntion的时,外部变量有定义,那么function内部就能访问。

  • 在函数内部创建一个变量

    cmake_minimum_required(VERSION 3.22)
    project(function_test)
    
    set(VAR1_IN_PARENT_SCOPE "parent var1")
    
    # 定义一个函数,接受2个入参,并将入参打印出来
    function(print var1 var2)
        message("-- Hello: [${var1}] and [${var2}]")
        message("-- show parent var: ${VAR2_IN_PARENT_SCOPE}")
        set(VAR_DEFINED_IN_FUNCTION "function var")
    endfunction()
    
    message("before invoke, show var from function: [${VAR_DEFINED_IN_FUNCTION}]")
    print("function test" "first time")
    message("first invoke, show var from function: [${VAR_DEFINED_IN_FUNCTION}]")
    
    set(VAR2_IN_PARENT_SCOPE "parent var2")
    print("function test" "sencond time")
    message("second invoke, show var from function: [${VAR_DEFINED_IN_FUNCTION}]")
    

    执行cmake .后的结果:

    before invoke, show var from function: []
    -- Hello: [function test] and [first time]
    -- show parent var: 
    first invoke, show var from function: []
    -- Hello: [function test] and [sencond time]
    -- show parent var: parent var2
    second invoke, show var from function: []
    

    说明:function内部创建的普通变量,只能在function内部使用。

  • 在函数内部创建一个变量,并使用PARENT_SCOPE

    cmake_minimum_required(VERSION 3.22)
    project(function_test)
    
    set(VAR1_IN_PARENT_SCOPE "parent var1")
    
    # 定义一个函数,接受2个入参,并将入参打印出来
    function(print var1 var2)
        message("-- Hello: [${var1}] and [${var2}]")
        message("-- show parent var: ${VAR2_IN_PARENT_SCOPE}")
        set(VAR_DEFINED_IN_FUNCTION "function var" PARENT_SCOPE)
    endfunction()
    
    message("before invoke, show var from function: [${VAR_DEFINED_IN_FUNCTION}]")
    print("function test" "first time")
    message("first invoke, show var from function: [${VAR_DEFINED_IN_FUNCTION}]")
    
    set(VAR2_IN_PARENT_SCOPE "parent var2")
    print("function test" "sencond time")
    message("second invoke, show var from function: [${VAR_DEFINED_IN_FUNCTION}]")
    

    执行cmake .后的结果:

    before invoke, show var from function: []
    -- Hello: [function test] and [first time]
    -- show parent var: 
    first invoke, show var from function: [function var]
    -- Hello: [function test] and [sencond time]
    -- show parent var: parent var2
    second invoke, show var from function: [function var]
    

    说明:function内部创建的普通变量使用PARENT_SCOPE选项,变量可以传递到function调用层范围,在function首次调用时创建。

相关文章

网友评论

      本文标题:CMake之function命令介绍

      本文链接:https://www.haomeiwen.com/subject/ciktvdtx.html