cmake中 macro和函数的区别

ops/2024/12/19 13:50:38/
  1. 语法形式上的区别
    • macro(宏)
      • 定义宏使用macro关键字,语法格式为macro(<macro_name> [arg1 [arg2 [...]]])。例如:
        macro(my_macro arg1 arg2)message("The first argument is ${arg1}")message("The second argument is ${arg2}")
        endmacro()
        
      • 调用宏时直接使用宏的名称和参数,如my_macro("value1" "value2")
    • function(函数)
      • 定义函数使用function关键字,语法格式为function(<function_name> [arg1 [arg2 [...]]])。例如:
        function(my_function arg1 arg2)message("The first argument of the function is ${arg1}")message("The second argument of the function is ${arg2}")
        endfunction()
        
      • 调用函数的方式和调用宏类似,如my_function("value1" "value2")。从语法形式上看,定义宏和函数的结构很相似,主要是关键字不同。
  2. 变量作用域的区别
    • macro(宏)
      • 宏中的变量作用域是全局的。这意味着在宏内部对变量的修改会影响到宏外部同名变量的值。例如:
        set(my_variable "original_value")
        macro(my_macro)set(my_variable "new_value")
        endmacro()
        my_macro()
        message("The value of my_variable is ${my_variable}")
        
      • 上述代码执行后,my_variable的值会被修改为new_value,因为宏内部的set命令改变了全局变量my_variable的值。
    • function(函数)
      • 函数内部的变量作用域是局部的。函数内部对变量的修改不会影响到函数外部同名变量的值。例如:
        set(my_variable "original_value")
        function(my_function)set(my_variable "new_value")
        endfunction()
        my_function()
        message("The value of my_variable is ${my_variable}")
        
      • 在这里,执行函数后my_variable的值仍然是original_value,因为函数内部的my_variable是一个局部变量,和外部的my_variable是不同的实体。
  3. 返回值机制的区别
    • macro(宏)
      • 宏没有明确的返回值机制。宏主要是通过修改全局变量或者执行一些命令来产生效果。不过,可以利用set命令来设置一个全局变量,以达到类似返回值的效果。例如:
        macro(my_macro arg)math(EXPR result "${arg} + 1")set(my_result ${result})
        endmacro()
        my_macro(2)
        message("The result is ${my_result}")
        
    • function(函数)
      • 函数可以通过return()命令返回一个值。例如:
        function(my_function arg)math(EXPR result "${arg} + 1")return(${result})
        endfunction()
        set(result_value [my_function(2)])
        message("The result is ${result_value}")
        
      • 在这个例子中,函数my_function计算了一个结果并通过return返回,外部可以通过变量来接收这个返回值。
  4. 参数传递方式的区别
    • macro(宏)
      • 宏在参数传递时,是简单的文本替换。这可能会导致一些意外的行为。例如:
        macro(my_macro arg)set(arg "${arg}_modified")message("The argument in the macro is ${arg}")
        endmacro()
        set(my_variable "original")
        my_macro(${my_variable})
        message("The variable outside the macro is ${my_variable}")
        
      • 宏内部对arg的修改不会影响到外部my_variable的传递,因为在传递时只是简单的文本替换,宏内部修改的arg和外部的my_variable没有直接关联。
    • function(函数)
      • 函数的参数传递更像是变量的传递。函数内部对参数的修改不会影响到外部同名变量,这是因为函数参数有自己的作用域。例如:
        function(my_function arg)set(arg "${arg}_modified")message("The argument in the function is ${arg}")
        endfunction()
        set(my_variable "original")
        my_function(${my_variable})
        message("The variable outside the function is ${my_variable}")
        
      • 同样,函数内部对arg的修改不会影响到外部的my_variable,但是这种参数传递方式和宏的文本替换方式是有本质区别的。

http://www.ppmy.cn/ops/143194.html

相关文章

娱乐五子棋(附加源码)

一写在开头 上期代码主要实现瀑布流功能&#xff0c;本期就来实现五子棋小游戏&#xff0c;开发久了很多功能都是通过框架组件库来完成&#xff0c;但是如果组件满足不了开发需求&#xff0c;还需要开发人员手动封装组件&#xff0c;专门出这样一期文章&#xff0c;通过原生js实…

rpc设计的再次思考20251215(以xdb为核心构建游戏框架)

1.服务提供者注册的方式 // 表明这是一个服务提供者&#xff0c;ServerType 和 ServerId从application.properties中读取 // 而且只有当当前服务是Game时&#xff0c;才生效。 或者 条件注解??? RpcProvider(typeServerType.Game) public class GameProvider{MsgReceiver…

04_ok_java_websocket_端口转发_将服务器的流端口转到本地

客户端socket package com.example.filedemo.controller; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.Base64; imp…

【论文笔记】CLIP-guided Prototype Modulating for Few-shot Action Recognition

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: CLIP-guided Prototype Mo…

Docker Desktop 4.37.0版本支持 命令行启动了

更新日志 Docker Desktop 4.37.0版本 支持命令行了&#xff0c;参考&#xff1a;https://docs.docker.com/desktop/release-notes/ 如下图所示 命令 点上图中的command line 可以看到相关的命令&#xff0c;如下图&#xff1a; 示例 以start为例&#xff0c;如下图所示&…

Nginx反向代理与负载均衡应用实践

Nginx反向代理与负载均衡应用实践 1.1 集群简介 简单地说 &#xff0c;集群就是指一组&#xff08;若干个&#xff09;相互独立的计算机 &#xff0c;利用高速通信网络组成的一 个较大的计算机服务系统 &#xff0c;每个集群节点&#xff08;即集群中的每台计算机&#xff09;…

uniapp小程序样式穿透

<script> export default {options: { styleIsolation: shared }, //加上这句小程序样式穿透也会有效果 }; </script><style lang"scss" scoped> ::v-deep .u-cell__body {background-color: #2a6ff6; } </style>

详细描述一下 Elasticsearch 更新和删除文档的过程。

1、删 除 和 更 新 也 都 是 写 操 作 &#xff0c; 但 是 Elasticsearch 中的 文 档 是 不 可 变 的 &#xff0c; 因 此 不 能被 删 除 或 者 改 动 以 展 示 其 变 更 &#xff1b; 2、磁盘 上 的 每 个 段 都 有 一 个 相 应 的 .del 文件 。当删 除 请 求 发 送 后 &#…