奇怪的宏

我C++确实不怎么样,不过近来不得不再唤醒那远古的记忆……即使光看代码也得要C++。
好吧,于是我需要wide版的__DATE__和__TIME__之类。但是那俩宏都是char*而不是wchar_t*的,咋办?

用L来转换?

直接转的话,不行。L__DATE__本身是一个有效的id,但却没这东西存在。
用一个宏:
#define WIDEN(x) L##x

也不行,原因同上。

偏偏这样就可以:
#define WIDEN(x) L##x
#define WIDEN2(x) WIDEN(x)


Why???
我得去复习宏展开的规则了……

========================================================

另外一个值得注意的问题。Visual C++的编译器中,宏展开的优先级比string concatenation高,而GCC/BCB等编译器则相反。所以下面的代码在VC里用不了:
WIDEN2(__DATE__ " " __TIME__)

而得写成:
WIDEN2(__DATE__) WIDEN2(" ") WIDEN2(__TIME__)

你可能感兴趣的:(C++,c,gcc,C#,vc++)