伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

C语言中#define在多行宏定义出错的原因及分析

目录

    C语言中#define在多行宏定义出错的原因
      1.第一种错误2.第二种错误
    使用#define宏定义的几个小技巧
      1.调试开关2.条件编译3.宏实现函数4.跨行宏定义5.防止头文件被反复包含6.带参宏与带参函数的区别7.注意事项
    总结


C语言中#define在多行宏定义出错的原因


1.第一种错误

#include<stdio.h>
#define echange(a,b) {\/*宏定义中允许包含多行命令的情形,此时必需在最右边加上"\"*/
 int t;\
 t=a;\
 a=b;\
 b=t;\
}
main()
{
 int c, d;
 c = 2;
 d = 3;
 printf("%d %d\n", c, d);
 echange(c,d)
 printf("%d %d\n", c, d);
 return 0;
}在用#define停止多行宏定义时,注释要放在"\"之前

2.第二种错误

#include<stdio.h>
#define echange(a,b) {/*宏定义中允许包含两道衣裳命令的情形,此时必需在最右边加上"\"*/\
 int t;\
 t=a;\
 a=b;\
 b=t;\
}/*在最后一行多加了一个"\"*/\
main()
{
 int c, d;
 c = 2;
 d = 3;
 printf("%d %d\n", c, d);
 echange(c,d)
 printf("%d %d\n", c, d);
 return 0;
}在用#define停止多行宏定义时,在最后一行加上"\“,我们使用#define停止多行定义时,默认最后一个”\“的下一行也属于宏定义范围,去掉最后一行的”\"即可
以下是代码的正确形式
#include<stdio.h>
#define echange(a,b) {/*宏定义中允许包含两道衣裳命令的情形,此时必需在最右边加上"\"*/\
 int t;\
 t=a;\
 a=b;\
 b=t;\
}
main()
{
 int c, d;
 c = 2;
 d = 3;
 printf("%d %d\n", c, d);
 echange(c,d)
 printf("%d %d\n", c, d);
 return 0;
}
使用#define宏定义的几个小技巧


1.调试开关

有时候编写程序时为方便查找错误,会在很多地方加上串口打印语句直观查看程序哪里出错。
但是,串口的输出是需要时间的,在项目根本完成时,就需要将这些打印关闭,但是一行一行的注释掉费时费力,不现实。
这时可以使用宏来当做一个"开关",直接操作这个宏就可以实现打印的开关,例如:
//#define    DEBUG(...)
#define        DEBUG    printf另外,还可以使用几个预定义的宏停止辅助:
__FILE__            // 文件
__FUNCTION__        // 函数
__LINE__            // 行号

DEBUG("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
2.条件编译

当程序为了适配更多不同的环境时,还可以使用条件宏来选择不同的代码模块:
#if 1
    printf("Hello!\n");
#else
    printf("Hi!\n");
#endif
3.宏实现函数

交换两个数:
#define swap(a,b)     ((a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b))比较两个数并且返回最小的数:
#define MIN(a,b)     ((a)<(b)?(a):(b))求数组元素个数:
#define LENGTH(array)    (sizeof(array) / sizeof(array[0]))
4.跨行宏定义

#define    SWAP(a,b)    do { \
                        int t = 0;\
                        t = a; \
                        a = b; \
                        b = t; \
                    } while(0)细心的你可能已经注意到以上宏末尾都没有带分号“;”

5.防止头文件被反复包含

#ifndef __TEST_H 
#define __TEST_H 
    // 头文件内容 
#endif
6.带参宏与带参函数的区别

    1.宏会在编译器在对源代码停止编译的时候停止简单交换,不会停止任何逻辑检测,即简单代码复制而已;2.宏停止定义时不会考虑参数的类型;3.参数宏的使用会使具有同一作用的代码块在目的文件中存在多个副本,即会增长目的文件的大小;4.参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作;5.参数宏在定义时要多加小心,多加括号;6.函数只在目的文件中存在一处,比较节省程序空间;7.函数的调用会牵扯到参数的传送,压栈/出栈操作,速度相对较慢;8.函数的参数存在传值和传地址(指针)的问题,参数宏不存在;

7.注意事项

    1.宏定义不会对引号内的参数停止交换;2.若要交换,可以在参数前面加上’#’转换成“字符串”,如:
#define dprint(expr) printf(#expr " = %d\n", expr)使用dprint(x/y)就被交换成:
printf("x/y" " = %g\n", x/y);即
printf("x/y = %g\n", x/y);
总结

以上为个人经历,希望能给大家一个参考,也希望大家多多支持网站。

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

王小雅
注册会员
主题 22
回复 17
粉丝 0
|网站地图
快速回复 返回顶部 返回列表