简述C语言中宏的作用及其副作用

引问:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个?

答案:#define  MIN(A,B)  ( (A) <= (B)? (A) : (B) )

知识梳理:

1). 标识#define在宏中应用的基本知识。直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法, 对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

2). 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码。

3). 懂得在宏中小心地把参数用括号括起来

4). 宏的副作用也是存在的。例如:当你写下面的代码时会发生什么事? least = MIN(*p++, b);

代码举例分析:

<span style="font-family:KaiTi_GB2312;font-size:18px;">#include<stdio.h>
#define MIN(x,y) ((x)<=(y)?(x):(y))
#
int main(){
    int a[4]={3,7,23,45},b=9;
    int *p=&a[0];
    printf("%d\n",*p++);
    printf("%d\n",MIN(*p++,b));
    printf("%d\n",*p);
    return 0;
}
</span>

结果输出:3     23     45

代码分析:指针p的地址会被加两次,最终返回*(p+2),而且每一次都是先返回值之后再移动.

PS:由于作者水平有限,如若有错误或不当的地方,还望读者不吝赐教!

时间: 2024-10-12 20:57:19

简述C语言中宏的作用及其副作用的相关文章

C语言中宏定义(#define)时do{}while(0)的价值(转)

C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总结了一下讨论,加上自己的理解,do{...}while(0)的价值主要体现在: 1. 增加代码的适应性 下面的宏定义没有使用do{...}while(0) #define FOO(x) foo(x); bar(x); 这样宏定义,单独调用不会出现问题,例如: FOO(100) 宏扩展后变成: 1 f

C语言中宏的使用(#,##,do…while(0)宏)

1.预定义宏的使用__FILE__,__FUNCTION__,__LINE__. #include <stdio.h> void fun(void) { char v1; short v2; int v3; long v4; printf("v1: %x\n",&v1); printf("v2: %x\n",&v2); printf("v3: %x\n",&v3); printf("v4: %x\n&

C语言中宏定义使用方法详解

C语言中的宏替换详解 首先看一个问题: #include <stdio.h> #define    PRINT_CLINE()    printf("%d", ______) int main(void) { PRINT_CLINE(); PRINT_CLINE(); return 0; } 在横线处填上适当的代码,使得上面这段代码的输出为34. 我想一般人看到这个问题的时候头脑里都没有明确的思路来解答这个它.我看到这个问题的时候想出了各种办法来解答它,最终还是没有通过编译

简单讲解C语言中宏的定义与使用

宏定义是预编译功能的一种, 预编译又称为预处理, 是为编译做的预备工作的阶段.处理#开头的指令, 比如拷贝 #include 包含的文件代码,#define宏定义的替换,条件编译等. 使用宏定义的好处:使用宏定义的好处:可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改.例如 π 这个常量,我们有时候会在程序的多个地方使用,如果每次使用都重新定义,一来比较麻烦,二来容易出错,所以我们可以把 π 做成宏定义来使用.   语法说明: (1)宏名一般用大写 (2)使用宏可提高程序的通用性

c语言中宏定义#和 ##的作用:

转载:http://www.cnblogs.com/cyttina/archive/2013/05/11/3072969.html 看了这篇文章后了解了,但是文章中的例子比较特别,我在这里加个注释好了. http://www.cnblogs.com/welkinwalker/archive/2012/03/30/2424844.html 单井号就是将后面的 宏参数 进行字符串操作,就是将后面的参数用双引号引起来 双井号就是用于连接. 比如文章中的例子: #define PRINT(NAME) p

C语言中宏定义之 ## 用于可变参数

GCC 支持复杂的宏,它使用一种不同的语法,使你可以给可变参数一个名字,如同其它参数一样,比如: 引用 #define debug(format, args...) fprintf(stderr, format, args) 这种定义可读性更强,也更容易描述.完整测试代码: 引用 #include <stdio.h> #define debug(format, args...) fprintf(stderr, format, args) int main(){    char a[20] = 

C语言中宏的运用------利用宏技术可以简化对某结构体变量的访问

利用宏技术可以简化对某结构体变量的访问 有时候,为了方便访问结构变量中的某个元素,我们可以利用宏去进行代码的替换. #include<stdio.h>#include<stdlib.h> struct data{ int len; int show;}; struct data Data;#define LEN Data.len  //为了访问而定义的宏 int main(){ LEN = 5; printf("%d\n",Data.len); Data.len

C语言中#和##的作用

使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. #include <stdio.h> #define STR1(x) #x//使x成为字符串 #define STR2(x, y) int(x##e##y)//将x.e.y连接成字符串 int main() { printf(STR1(1)); putchar(10); printf("%d", STR2(3, 2)); return 0; } 运行结果:

C语言中的序列点和副作用

参考: http://www.2cto.com/kf/201210/161225.html