zoukankan      html  css  js  c++  java
  • #define连接字符串的特殊方法[转]

    //在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。

    #define Conn(x,y)    x##y   //连接x,y

    #define ToChar(x)    #@x    //加单引号

    #define ToString(x)  #x     //加双引号  即将x转换为字符串 相当于c++  to_string函数

        最近看com相关的资料,看到CCmdTarget实现com接口的时候,去读了一些宏的定义,在afxdisp.h头文件中

    #define BEGIN_INTERFACE_PART(localClass, baseClass)
    class X##localClass : public baseClass

    本来这个宏定义很容易理解的,但是这里多出个X##,我真没见过这种用法,不晓得它是什么用意。
    后来问了几个朋友也都不知道。

    你知道么?

    也许你也不知道~呵呵,最后我还是找到了相关的资料,解读了这个define,还顺便认识了另外两个不常用的define

    #define Conn(x,y) x##y
    #define ToChar(x) #@x
    #define ToString(x) #x

    x##y表示什么?表示x连接y,举例说:
    int n = Conn(123,456);   结果就是n=123456;
    char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
    怎么样,很神奇吧

    再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
    char a = ToChar(1);结果就是a='1';
    做个越界试验char a = ToChar(123);结果是a='3';
    但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant   :P

    最后看看#x,估计你也明白了,他是给x加双引号
    char* str = ToString(123132);就成了str="123132";

    最后留几个小试验给大家去测测:
    #define Dec(x,y) (x-y)
    int n = Dec( A(123,1), 1230);
    n = Conn(123, Conn(123,332) );
    char* str = A("12", ToString( Dec(3,1));

    转载自: https://www.cnblogs.com/skyofbitbit/p/4210626.html

  • 相关阅读:
    Python 7步机器学习
    STL容器-- map and multimap 用法
    STL容器-- forward_list 用法
    STL容器-- fixed-size array 用法
    STL容器-- deque 用法
    网站502与504错误分析
    git将一个分支的某个文件合并到当前分支
    阿里云RDS上用mysqldump导入导出
    mysqldump具体应用实例
    mysql的导入导出工具mysqldump命令详解
  • 原文地址:https://www.cnblogs.com/li-lou/p/12307499.html
Copyright © 2011-2022 走看看