- 语法形式上的区别
- 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")
。从语法形式上看,定义宏和函数的结构很相似,主要是关键字不同。
- 定义函数使用
- macro(宏):
- 变量作用域的区别
- 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
是不同的实体。
- 函数内部的变量作用域是局部的。函数内部对变量的修改不会影响到函数外部同名变量的值。例如:
- macro(宏):
- 返回值机制的区别
- 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
返回,外部可以通过变量来接收这个返回值。
- 函数可以通过
- macro(宏):
- 参数传递方式的区别
- 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
,但是这种参数传递方式和宏的文本替换方式是有本质区别的。
- 函数的参数传递更像是变量的传递。函数内部对参数的修改不会影响到外部同名变量,这是因为函数参数有自己的作用域。例如:
- macro(宏):