计算机
c base
c++ 基础 作用域及生命周期
c++ template
c++ 内存视角
c++ 函数指针
c++ 基础 基础语法
c++ 多线程
c++ 性能
c++ 类 基础
c++ 类 对象模型 类析构
c++ 类 设计模式
cmake
CMAKE环境搭建 windows
创建第一个cmakelists.txt
构建稍复杂的项目
动态链接库
EX1
EX1 START
EX1 ANSWER
EX2
EX2 START
EX2 ANSWER
EX3
EX3 START
EX3 ANSWER
变量
控制流程
函数和宏
查找和使用外部库
生成器表达式
qt 开发环境
qt c++
理解QObject 1
理解QObject 4
qt index
qt qml quick
qt ui
qt 多线程
数据结构 数组
PC问题监控及排查
PC程序性能优化
OS
TOOL
C++ STL
编程漫谈
C++实战-生产者 消费者流水线
C++实战 IO
本站点使用 MrDoc 构建
-
+
函数和宏
## 函数 ```cmake function(function_name arg1 arg2) # 函数体 message("arg1 = ${arg1}") message("arg2 = ${arg2}") endfunction() # 调用函数 function_name("hello" "world") ``` ##### 变量作用域 使用 `PARENT_SCOPE` 关键字修改父作用域的变量: ```cmake function(set_version) set(VERSION "1.2.3" PARENT_SCOPE) endfunction() set_version() message("VERSION = ${VERSION}") # 输出: 1.2.3 ``` ##### 返回值 CMake 函数没有显式的返回值,但可以通过 `PARENT_SCOPE` 实现>: ```cmake function(add_numbers a b result_var) math(EXPR sum "${a} + ${b}") set(${result_var} ${sum} PARENT_SCOPE) endfunction() add_numbers(10 20 result) message("Result = ${result}") # 输出: 30 ``` ##### 可变参数 使用 `ARGN` 访问额外的参数: ```cmake function(print_all first) message("First argument: ${first}") message("All arguments: ${ARGV}") message("Extra arguments: ${ARGN}") message("Argument count: ${ARGC}") endfunction() print_all(one two three four) # 输出: # First argument: one # All arguments: one;two;three;four # Extra arguments: two;three;four # Argument count: 4 ``` ##### 命名参数 使用 `cmake_parse_arguments()` 实现命名参数: ```cmake function(create_library) # 定义参数 set(options SHARED STATIC) set(oneValueArgs NAME VERSION) set(multiValueArgs SOURCES HEADERS) # 解析参数 cmake_parse_arguments( ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) # 使用参数 message("Library name: ${ARG_NAME}") message("Version: ${ARG_VERSION}") message("Sources: ${ARG_SOURCES}") if(ARG_SHARED) add_library(${ARG_NAME} SHARED ${ARG_SOURCES}) else() add_library(${ARG_NAME} STATIC ${ARG_SOURCES}) endif() endfunction() # 调用 create_library( NAME mylib VERSION 1.0 SOURCES src/a.cpp src/b.cpp HEADERS inc/a.h inc/b.h SHARED ) ``` ## 宏 ```cmake macro(macro_name arg1 arg2) # 宏体 message("arg1 = ${arg1}") message("arg2 = ${arg2}") endmacro() # 调用宏 macro_name("hello" "world") ``` ## 宏 函数差异 - 作用域 - 函数:有自己的作用域 - 宏:调用者自己的领域展开 - 变量 - 函数:局部变量不影响外部 - 宏:所有变量修改都影响调用者 - 参数 - 函数:参数是真实的变量 - 宏:参数是文本替换 ##### 作用域差异 ```cmake # 函数示例 function(my_function) set(MY_VAR "from function") endfunction() # 宏示例 macro(my_macro) set(MY_VAR "from macro") endmacro() # 测试 my_function() message("After function: ${MY_VAR}") # 空值 my_macro() message("After macro: ${MY_VAR}") # 输出: from macro ``` ##### 参数替换差异 ```cmake # 宏中的参数是文本替换 macro(print_arg arg) message("Argument: ${arg}") message("ARGV0: ${ARGV0}") endmacro() set(MY_VAR "hello") print_arg(${MY_VAR}) # 输出: # Argument: hello # ARGV0: hello # 如果传递变量名而不是值 print_arg(MY_VAR) # 输出: # Argument: hello (宏会展开 ${MY_VAR}) # ARGV0: MY_VAR ```
peipeo
2026年5月16日 13:52
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码