问题 : 在宏中定义 # 号 ,我们知道 # 在宏中,把#后的字串变成字符串,##会和后面的字串合并成一个新的串,如果我想在 宏中 定义 # ,怎么办呢?
具体:#define FF(X) \
#ifdef X \
..... \
#endif
我的目的
在程序用
#define DEF用FF(DEF)扩展成#ifdef DEF
.....
#endif 这个肯定是错的,那么,怎么才能在 #define 后定义的串中,包括#号
具体:#define FF(X) \
#ifdef X \
..... \
#endif
我的目的
在程序用
#define DEF用FF(DEF)扩展成#ifdef DEF
.....
#endif 这个肯定是错的,那么,怎么才能在 #define 后定义的串中,包括#号
SHARP##ifdef DEF\
.....
SHARP##endif \
usage: FF(__MY_DEF__, #)
to yjgx007(还不结帖?!听妈妈的话! http://www.geekclaw.com)
错误 1 error C2121: “#”: 无效字符 : 可能是宏展开的结果 d:\project\openssl\project\wrappssl.cpp 26 ##,可能不能把#和后面的串合并
这样的编译通不过
我试了
连 ??= (#的同义通配符 ) 都不行...
如果LZ是嫌这个#ifdef .... #endif
内容太长,而影响CPP文件美观的话,
可以把它写在一个.h文件里 然后#include..这样的效果和宏定义一样的..
如果不是,那我就不知道你为什么想这样写了...
如下:
#define ff(x) #x
ff(x)会被展开成 "x"
也即你可以.
cout<<ff(s)<<endl;
这样的话 或许#ifdef 将被处理成 "ifdef" ~~~ 但是VC没有那样处理..
你可以在工程编译选项里加上 /P 参数 这样会产生**.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次回复了,就只能说到这里了,我感觉我自己是不可能再想出什么办法了)