• C语言宏展开


    参考自:

    https://blog.csdn.net/buye1986/article/details/45100339

    c语言宏展开

    ①一个较长的宏定义可以分成若干行,这需要在待续的行末尾加上一个反斜杠符””

    #define TUP_ASSERT(__expression) do {

            if (!( __expression ))

            {

                SYSLOG_LEGACY(EAaSysLogSeverityLevel_Error,"<TUP ASSERTION FAILED> (%s) file: %s line:%u", #__expression,__FILE__, __LINE__);

                AaErrorAssertion(#__expression,__FILE__, __LINE__);

            }

    } while(0)

    ②在替换文本中,参数名以#作为前缀则结果将被扩展为由实际参数替换该参数的带引号的字符串

    #define dprint(expr) printf(#expr “ =%g ”, expr)

    使用语句dprint(x/y),该宏将被扩展为  printf(“x/y” “= %g ”, x/y);

    ③预处理运算符##为宏展开提供参数连接的作用

    #define paste(front, back) front ##back

    宏调用paste(name,1)的结果为 name1

    ④宏展开顺序大致可以归结为:

    有点类似于函数调用的顺序

    1 先外层展开一次, 用实参代替形参,将实参代入宏文本中

    2 然后实参宏展开

    3 实参展开结束, 返回外层是否还有宏定义需要展开, 是, 则继续展开

    如果在第2步,实参代入宏文本后,实参之前或之后遇到###,实参不再展开

    例1:

    #define cat(a,b) a ## b

    宏调用:cat(cat(1, 2), 3) 的展开顺序为:

    cat(cat(1, 2), 3) -->cat(1, 2) ## 3  -->cat(1, 2)3

    cat(1,2)仍是宏,但后面是##,不再展开,结果为:cat(1, 2)3

    例2:

    #definecat(a,b) a ## b

    #definexcat(x, y) cat(x, y)

    宏调用 xcat(xcat(1, 2), 3) 的展开顺序为:

    xcat(xcat(1,2), 3) -->cat(xcat(1, 2), 3) -->cat(cat(1, 2), 3) -->cat(1 ## 2, 3) --> 1 ##2 ## 3 -->123

    务必注意参数的处理顺序,第二步在第三步前面执行,第一层宏展开后,实参是宏,则首先处理实参的宏展开,即使宏替换后本身也是宏。在例2中,虽然也生成的cat(cat(1, 2), 3),但是是首先执行里面的cat(1, 2), 所以结果不一样。例2中以下顺序是错的:

    xcat(xcat(1,2), 3) --> cat(xcat(1, 2), 3) --> xcat(1, 2) ## 3 -->xcat(1, 2)3

    在Linux测试结果:

    使用gcc –E 编译可以只做预处理:源文件hepeng.c:

    *****************************************************************************

    #define cat(a,b) a ## b

    #define xcat(x,y) cat(x,y)

    int  main()

    {

       cat(cat(1,2),3);

       xcat(xcat(1,2),3);

       xcat(cat(1,2),3);

        return 0;

    }

    *****************************************************************************

    [penhe@hzling23 program]$gcc -E hepeng.c |more

    *****************************************************************************

    # 1 "hepeng1.c"

    # 1 "<built-in>"

    # 1 "<command line>"

    # 1 "hepeng1.c"

    int main()

    {

        cat(1,2)3;

        123;

        123;

        return 0;

    }

    *****************************************************************************

    vs应该也有类似的命令, 不过我发现网上有其他简单的方法,

    https://blog.csdn.net/qyee16/article/details/9322281 所示

  • 相关阅读:
    Call指令和Ret指令讲解02 零基础入门学习汇编语言49
    指针01 零基础入门学习C语言41
    Call指令和Ret指令讲解03 零基础入门学习汇编语言50
    Call指令和Ret指令讲解01 零基础入门学习汇编语言48
    指针01 零基础入门学习C语言41
    指针02 零基础入门学习C语言42
    Call指令和Ret指令讲解02 零基础入门学习汇编语言49
    VC++2012编程演练数据结构《31》狄杰斯特拉算法
    VC++2012编程演练数据结构《30》弗洛伊德算法
    在Windows Azure Web Site上为Node.js自动安装NPM包
  • 原文地址:https://www.cnblogs.com/talenth/p/12574061.html
Copyright © 2020-2023  润新知