【发布时间】:2014-07-31 20:29:09
【问题描述】:
演示程序:
#include <iostream>
using namespace std;
#define WC(p) L#p
int main()
{
wcout << WC(XXX);
}
它在 Visual C++ 上运行良好,但在 Linux 上的 Clang 和 GCC 上都无法编译。错误(clang 3.4,Linux):
- file.cpp:8:11:错误:使用未声明的标识符“L”
- file.cpp:4:15:注意:从宏 'WC' 扩展
为什么会失败?如何使用 C 定义创建宽字符字符串文字?就我而言,这种能力将大大减少代码重复。
【问题讨论】:
-
MSVC 预处理器是非标准的:它适用于字符流,而不是应有的标记流。经典示例:
#define N(x) -x,然后N(N(1));在 MSVC 中产生错误,因为它扩展为--1(减量),而不是- - 1(两个一元否定)。 GCC 和 clang 是正确的:只是将L令牌和"xyz"令牌放在一起不应产生单个L"xyz"令牌;为此,您需要一个令牌粘贴##运算符。
标签: c++ visual-c++ gcc clang