zoukankan      html  css  js  c++  java
  • C++宏

    关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:

    #define WARN_IF(EXP)     \
         do{ if (EXP)     \
                 fprintf(stderr, "Warning: " #EXP "\n"); }    \
         while(0)
    那么实际使用中会出现下面所示的替换过程:
    WARN_IF (divider == 0);

    被替换为

    do {
         if (divider == 0)
    fprintf(stderr, "Warning" "divider == 0" "\n");
    } while(0);

    这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。

    而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那么下面的代码就非常实用:

    struct command
    {
    char * name;
    void (*function) (void);
    };

    #define COMMAND(NAME) { NAME, NAME ## _command }

    // 然后你就用一些预先定义好的命令来方便的初始化一个command结构的数组了:

    struct command commands[] = {
    COMMAND(quit),
    COMMAND(help),
    ...
    }
    COMMAND宏在这里充当一个代码生成器的作用,这样可以在一定程度上减少代码密度,间接地也可以减少不留心所造成的错误。我们还可以n个##符号连接 n+1个Token,这个特性也是#符号所不具备的。比如:
    #define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

    typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);
    // 这里这个语句将展开为:
    // typedef struct _record_type name_company_position_salary;
     


    作者:GangWang
    出处:http://www.cnblogs.com/GnagWang/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    P1271 【深基9.例1】选举学生会(基数排序)
    P7076 [CSP-S2020] 动物园
    #10127. 「一本通 4.3 练习 1」最大数
    P2671 [NOIP2015 普及组] 求和
    P3369 【模板】普通平衡树
    P2503 [HAOI2006]均分数据
    P2846 [USACO08NOV]Light Switching G(动态开点写法)
    P6278 [USACO20OPEN]Haircut G
    P2341 [USACO03FALL][HAOI2006]受欢迎的牛 G
    P1012 [NOIP1998 提高组] 拼数
  • 原文地址:https://www.cnblogs.com/GnagWang/p/1704441.html
Copyright © 2011-2022 走看看