问题 : 在宏中定义 # 号 ,我们知道 # 在宏中,把#后的字串变成字符串,##会和后面的字串合并成一个新的串,如果我想在 宏中 定义 # ,怎么办呢?
具体:#define FF(X)   \
#ifdef X  \
.....     \
#endif     
我的目的
在程序用 
#define DEF用FF(DEF)扩展成#ifdef DEF
.....     
#endif     这个肯定是错的,那么,怎么才能在 #define 后定义的串中,包括#号

解决方案 »

  1.   

    有意义吗?实在不行,宏参可以传#,然后在宏展开后连接。#define FF(DEF, SHARP)\
    SHARP##ifdef DEF\
    .....
    SHARP##endif \
    usage: FF(__MY_DEF__, #)
      

  2.   


    to yjgx007(还不结帖?!听妈妈的话! http://www.geekclaw.com)
    错误 1 error C2121: “#”: 无效字符 : 可能是宏展开的结果 d:\project\openssl\project\wrappssl.cpp 26 ##,可能不能把#和后面的串合并
      

  3.   

    #define FF(X, SHARP) SHARP##define XFF(III,#)
    这样的编译通不过
      

  4.   

    VC下估计就是不行的吧..
    我试了 
    连 ??= (#的同义通配符 ) 都不行...
    如果LZ是嫌这个#ifdef ....   #endif
    内容太长,而影响CPP文件美观的话,
    可以把它写在一个.h文件里 然后#include..这样的效果和宏定义一样的..
    如果不是,那我就不知道你为什么想这样写了...
      

  5.   

    另外 #在宏中是有固定意义的.
    如下:
    #define ff(x)  #x
    ff(x)会被展开成 "x"
    也即你可以.
    cout<<ff(s)<<endl;
    这样的话 或许#ifdef  将被处理成 "ifdef"  ~~~  但是VC没有那样处理.. 
    你可以在工程编译选项里加上  /P 参数 这样会产生**.i文件  也就是预处理的结果.
      

  6.   

    我查看了下**.i里的内容 发现问题不少....
    如果你使用了 续行符 那么预编译后的结果是
    #ifdef  #endif
    这个仿佛是难以逾越的困难了....
    也许我没说清楚.

    #define A \
    #ifdef \
    #endif 
    A   -->   #ifdef   #endif  (我们需要它换行 可是它没有)
    如果:
    #define A \
    #ifdef 
    #endif 
    那么A就只定义到了 #ifdef 就停止了  因为宏定义只能有一行..所以这时候就需要一个符号 来告诉VC 这里要换行,,我很可笑的使用了 \n
    呵呵 代码里确实有了\n
     #ifdef  \n #endif    (呵呵)
    百度搜索了下C++里是否有所谓的象\一样的换行符 结果貌似没有..我完全没听说过就也肯定没有了...建议给C++标准协会发邮件,叫他们添加这个符号,能将一行分为2行.呵呵....
    总结: 宏定义的展开只能是一行的结果, 如果你想用宏来表达一个多行的结果,就肯定会失败.
    而我们这里的#ifdef 和 #endif必须是多行的...就注定它不能用宏来代替.当然我的总结是一厢情愿的,也可能头晕理解有误...  不排除有解决办法.
    (3次回复了,就只能说到这里了,我感觉我自己是不可能再想出什么办法了)