• #、#@、## in C++宏定义


    字符串化操作  #

    http://msdn.microsoft.com/en-US/library/7e3a913x(v=vs.80).aspx 

    注意:

    宏中遇到#或##时就不会再展开宏中嵌套的宏了

    code:

       1:  #define STRING(x) #x  
       2:  printf("%s
    ", STRING(__FILE__));  /*指向"__FILE__"而不是"E:\XXX.cpp"形式*/

    结果:

    image 

     

    code:

       1:  printf("%s
    ", __FILE__);

    结果:

    image 

    推荐使用

    code:

       1:  #define _STRING(x) #x 
       2:  #define STRING(x) _STRING(x) 
       3:  printf("%s
    ", STRING(__FILE__));

    结果:

    image

     

    字符化操作     #@

    http://msdn.microsoft.com/en-US/library/91tt6dfs(v=vs.80).aspx

    code:

       1:  #define makechar(x)  #@x
       2:  char ch = makechar(b);

    结果:

    image

    符号拼接操作 ##

    http://msdn.microsoft.com/en-US/library/09dwwt6y(v=vs.80).aspx

    code:

       1:  #define paster( n ) printf( "token"#n" = %d
    ", token##n )
       2:  int token9 = 100;
       3:  paster( 9 );

    结果:

    image 

    解析:

    宏展开后token##n直接合并变成了token9。整个语句变成了

       1:  printf( "token""9"" = %d
    ", token9 );

    在C语言中字符串中的二个相连的双引号会被自动忽略,于是上句等同于

       1:  printf("token9 = %d
    ", token9);

         注意点:

       不要使用##连接字符串,字符串是直接拼接的。

         比如 生成 如xxx.cfg的字符串

               #file_name##".cfg"   vs能够正常拼接,但是当在linux下gcc编译时报错

               应修改为 #file_name".cfg"

  • 相关阅读:
    python 线程队列PriorityQueue(优先队列)(37)
    python 线程队列LifoQueue-LIFO(36)
    python线程队列Queue-FIFO(35)
    python线程障碍对象Barrier(34)
    关于mybatis 在C#.Net中批量增,删,改
    c#如实现将一个数字转化为其他进制字符串输出
    Tostring(); 括号中的参数 格式化字符串
    前端笔记之HTML5&CSS3(上)新特性&音频视频&本地存储&自定义属性
    前端笔记之jQuery(下)事件&节点操作&净位置&拖拽&页面卷动值&遍历JSON
    前端笔记之jQuery(上)加载函数的区别&对象&操作HTML/CSS&动画&选择器
  • 原文地址:https://www.cnblogs.com/liaokang/p/3638803.html
Copyright © 2020-2023  润新知