宏和函数的区别以及宏的一些简单用法介绍

时间:2023-01-30 23:33:13

宏和函数的区别

宏的定义:#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro),或者定义宏(define macro)。
函数:它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。每次使用时只需要调用即可
——————————————————————————————————————————————————————————————————————————————
函数和宏的区别主要从下面几个方面来讨论: 1.代码长度: :每次使用时代码宏都会被插入到程序中,除了非常小的宏之外,会将程序的篇幅大大增长。 函数:函数的代码只出现在一个位置,每次使用函数时,就调用那个位置的代码。
2.执行速度: :参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。 函数:存在调用/返回的额外时间。
3.括号内的操作符 优先级 :宏参数的求值是在所有周围表达式的上下文环境里,除非它们加上括号(尽量能加就加,不要吝啬括号),否则邻近操作符的优先级可能会产生不可预料的结果。(下面文章会有代码演示) 函数:函数参数只在被调用前求值一次,它的结果传递给参数,并不会导致多种求值过程。表达式的求值结果更容易预测
4.参数求值: :参数每次用于宏定义时,他们都将重新求值,由于多次求值,具有副作用的参数可能会产生不可预料的结果(下面文章会有代码演示 函数:参数在被调用前只求值一次,在函数中多次使用参数并不会导致多种求值过程,参数的副作用并不会造成任何特殊问题。
5.参数类型: :宏宇类型无关,只要对参数的操作是合法的(比如比大小,只要能用>作比较就可以实现),它可以使用于任何参数类型。 函数:函数的参数需要定义类型,如果参数的类型不同,就要使用不同的函数,及时它们的执行任务是相同的。
———————————————————————————————————————————————————

宏的一些简单用法介绍

宏的申明方式: #define name(x) x*x 注意:参数列表的左括号必须与name紧邻。 如果两者之间有空白,参数列表会被解释为x*x中的一部分。
使用宏的一些需要注意的地方(坑): 1.括号问题 如 #define square(x) x*x     一般使用square(5); 没问题,因为文本将会替换为5*5,结果为25.     但是使用square(2+1); 我们来试一下,并预测一下结果     
int main()
{
printf("%d\n",square(2+1));
return 0;
}
   如果你认为答案是9,那就进坑了
   实际在编译过程中,已经将宏文本替换,priintf("%d\n",2+1*2+1);    现在看起来一目了然,结果是5。
2.#和##在宏 中的使用 使用#把一个宏参数转化其对应的字符串。 例:
int i = 10;
#define PRINT(FORMAT,VALUE) printf("the value of\
" #VALUE " is "FORMAT"\n",VALUE);
PRINT("%d",i+3);

return 0;

宏和函数的区别以及宏的一些简单用法介绍

##把两边的符号合为一个符号 例:
#define ADD_TO_SUM(num,value) sum##num += value;
int sum5 = 0;
int ret = ADD_TO_SUM(5,10);
printf("%d",ret);

将num=5赋值后,此时的sum##num相当于,sum5 += 10;