• 通过#define连接字符串的特殊方法[转]


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

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

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

    #define ToString(x)  #x     //加双引号

        最近看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));
    结果会如何呢? 嘿嘿嘿嘿~


    其他一些杂七杂八的东西:
    我先定义了一个宏
    #define TE text
    我想再定义一个宏,能将TE变为字符串("text").
    即定义:
    #define STR(str) ??? //使用STR(TE)时能替换为"text"。
    请问???部分怎么实现呢?用#str是达不到目的的了,用'"'##str##'"'也不对。

    #不能做二次替換,可以再定義一個中間宏
    #define TE text
    #define AD TE
    #define STR(AD) #AD
    試試

    直接定义两个宏得了!
    #define TE text
    #define TE_S "text"


    #define STR abc
    char arr[10] = "STR";
    为什么arr数组中是STR而不是abc,define不是简单的字符替换吗?

    #define A "aaa"
    #define B "bbb"A
    我对macro这个东西不大熟悉……不过这样可以成功printf("%s ",B);


    在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。
    #include <stdio.h>
    #define paster( n ) printf( "token " #n" = %d ", token##n )
    int main()
    {
    int token9=10;
    paster(9);
    return 0;
    }
    输出为
    [leshy@leshy src]$ ./a.out
    token 9 = 10

    补充一点: 在用#define 定义时 ,可以用斜杠("") 续行.与vb中的下划线(" _")作用同.
    比如:
    #define add1( x, y ) ( x + y)
    也可以表示成 :
    #define add1(x,y)
    (x + y )

    3个普通用法
    1.
    C: #define X 100   ----> C++: const int x=100;

    2.
    C: #define MAX(a,b) ((a)>(b)?(a):(b))
    C++: inline int max(int a,int b){ return a>b?a:b;}

    3.
         #ifndef NULL
             #define NULL ((void*)0)
         #endif

         #ifndef _myheadfile_h
             #define _myheadfile_h
         #endif

  • 相关阅读:
    assert出问题了?
    UIWebView 禁止检测链接弹出UIActionSheet
    UIWebView 禁止检测链接弹出UIActionSheet
    Linux命令行下常用svn命令
    Linux命令行下常用svn命令
    续上文,Unity3D面试ABC
    续上文,Unity3D面试ABC
    部署 H3C CAS E0306
    部署 H3C CAS E0306
    H3C CAS 介绍 & 基本概念
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/4210626.html
Copyright © 2020-2023  润新知