广告位联系
返回顶部
分享到

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

C语言 来源:互联网 作者:佚名 发布时间:2023-02-26 11:15:59 人浏览
摘要

C语言中#define在多行宏定义出错的原因 1.第一种错误 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #includestdio.h #define echange(a,b) {\/*宏定义中允许包含多行命令的情形,此时必须在最右边加上\*/ int t;

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

1.第一种错误

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#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.第二种错误

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#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进行多行定义时,默认最后一个”\“的下一行也属于宏定义范围,去掉最后一行的”\"即可

以下是代码的正确形式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#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.调试开关

有时候编写程序时为方便查找错误,会在很多地方加上串口打印语句直观查看程序哪里出错。

但是,串口的输出是需要时间的,在项目基本完成时,就需要将这些打印关闭,但是一行一行的注释掉费时费力,不现实。

这时可以使用宏来当做一个"开关",直接操作这个宏就可以实现打印的开关,例如:

1

2

//#define    DEBUG(...)

#define        DEBUG    printf

另外,还可以使用几个预定义的宏进行辅助:

1

2

3

4

5

__FILE__            // 文件

__FUNCTION__        // 函数

__LINE__            // 行号

 

DEBUG("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

2.条件编译

当程序为了适配更多不同的环境时,还可以使用条件宏来选择不同的代码模块:

1

2

3

4

5

#if 1

    printf("Hello!\n");

#else

    printf("Hi!\n");

#endif

3.宏实现函数

交换两个数:

1

#define swap(a,b)     ((a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b))

比较两个数并且返回最小的数:

1

#define MIN(a,b)     ((a)<(b)?(a):(b))

求数组元素个数:

1

#define LENGTH(array)    (sizeof(array) / sizeof(array[0]))

4.跨行宏定义

1

2

3

4

5

6

#define    SWAP(a,b)    do { \

                        int t = 0;\

                        t = a; \

                        a = b; \

                        b = t; \

                    } while(0)

细心的你可能已经注意到以上宏末尾都没有带分号“;”

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

1

2

3

4

#ifndef __TEST_H 

#define __TEST_H 

    // 头文件内容 

#endif

6.带参宏与带参函数的区别

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

7.注意事项

  • 1.宏定义不会对引号内的参数进行替换;
  • 2.若要替换,可以在参数前面加上’#’转换成“字符串”,如:

1

#define dprint(expr) printf(#expr " = %d\n", expr)

使用dprint(x/y)就被替换成:

1

printf("x/y" " = %g\n", x/y);

1

printf("x/y = %g\n", x/y);


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/qq_45158026/article/details/104025617
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计