温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2023-02-24 17:38:18 来源:亿速云 阅读:147 作者:iii 栏目:开发技术

这篇文章主要介绍了C语言中#define在多行宏定义出错的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中#define在多行宏定义出错的原因是什么文章都会有所收获,下面我们一起来看看吧。

    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.若要替换,可以在参数前面加上&rsquo;#&rsquo;转换成“字符串”,如:

    #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);

    关于“C语言中#define在多行宏定义出错的原因是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C语言中#define在多行宏定义出错的原因是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI