【cmake】宏macro与函数function

宏macro与函数function

cmake中的宏(macro)和函数(function)都支持动态参数
  • 变量ARGC记录传入的参数个数
  • 变量ARGV0,ARGV1,...顺序代表传入的参数
  • 变量ARGV则是一个包含所有传入参数的list
  • 变量ARGN也是一个包含传入参数的list,但不是所有参数,而是指macro/function声明的参数之后的所有传入参数。

1. 例子:

cmake_minimum_required(VERSION 3.17.5)
# 设置工程名称
set(PROJECT_NAME KAIZEN)
 # 设置工程版本号
set(PROJECT_VERSION "1.0.0.10" CACHE STRING "默认版本号")
 
# 工程定义
project(${PROJECT_NAME}
    LANGUAGES CXX C
    VERSION ${PROJECT_VERSION}
)
 
# 打印开始日志
message(STATUS "\n########## BEGIN_TEST_FUNCTION")
 
# 定义函数
function(test_func_argument age)
    # 打印ARGN参数值
    message(STATUS "ARGN: ${ARGN}")
    # 打印ARGC参数值
    message(STATUS "ARGC: ${ARGC}")
    # 打印ARGV参数值
    message(STATUS "ARGV: ${ARGV}")
    # 打印ARGV0参数值
    message(STATUS "ARGV0: ${ARGV0}")
    
    # 打印参数个数
    list(LENGTH ARGV argv_len)
    message(STATUS "length of ARGV: ${argv_len}")
    
    # 遍历打印各参数值
    set(i 0)
    while(i LESS ${argv_len})
        list(GET ARGV ${i} argv_value)
        message(STATUS "argv${i}:${argv_value}")
        math(EXPR i "${i} + 1")
    endwhile()
    
    if (ARGV1) # ARGV1 is a true variable
        message(STATUS "ARGV1: ${ARGV1}")
    endif()
    
    if (DEFINED ARGV2) # ARGV2 is a true variable
        message(STATUS "ARGV2: ${ARGV2}")
    endif()
    
    if (ARGC GREATER 2) # ARGC is a true variable
        message(STATUS "ARGC: ${ARGC}")
    endif()
    
    foreach (loop_var IN LISTS ARGN) # ARGN is a true variable
        message(STATUS "var: ${loop_var}")
    endforeach()
endfunction()
 
message(STATUS "\n")
test_func_argument(22 33 44)
 
# 打印结束日志
message(STATUS "########## END_TEST_FUNCTION\n")
输出:
########## BEGIN_TEST_FUNCTION
-- 

-- ARGN: 33;44
-- ARGC: 3
-- ARGV: 22;33;44
-- ARGV0: 22
-- length of ARGV: 3
-- argv0:22
-- argv1:33
-- argv2:44
-- ARGV1: 33
-- ARGV2: 44
-- ARGC: 3
-- var: 33
-- var: 44
-- ########## END_TEST_FUNCTION
 

参考资料

posted @ 2023-09-21 11:31  苏格拉底的落泪  阅读(112)  评论(0编辑  收藏  举报