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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    RabbitMQ入门(二)工作队列
    RabbitMQ入门之Hello World
    利用JMeter测试Tornado的多线程
    使用SQLAlchemy操作MySQL
    计算斐波那契数列的性能对比:Python,Java,Go
    PyCharm使用之配置SSH Interpreter
    Android数据绑定技术一,企业级开发
    Retrofit网络请求库应用02——json解析
    Servlet与Jsp的结合使用实现信息管理系统二
    Retrofit网络请求库应用01
  • 原文地址:https://www.cnblogs.com/GnagWang/p/1704441.html
Copyright © 2011-2022 走看看