2010-04-28 114 views
4

有人可以解释为什么以下不起作用?C++翻译阶段混乱

int main() // Tried on several recent C++ '03 compilers. 
{ 
    #define FOO L 
    const wchar_t* const foo = FOO"bar"; // Will error out with something like: "identifier 'L' is undefined." 
    #undef FOO 
} 

我认为预处理是在比字符串文字操作和通用记号翻译更早的翻译阶段完成的。

岂不编译器或多或少的看到这一点:

int main() 
{ 
    const wchar_t* const foo = L"bar"; 
} 

这将是巨大的,如果有人能举出从标准的解释。

回答

6

用途:

#define FOO L\ 

没有尾随\会有L与宏替换字符串之间的空格。这是从g++ -E结果:

const wchar_t* const foo = L "bar"; 
+0

当然!谢谢。实际上应该查看预处理过的输出... – blakecl 2010-04-28 02:26:55

+2

确保在此定义和下一行之间留有空行,否则宏将继续。过去我曾多次使用这种方法来制作多行宏。 – 2010-04-28 02:40:47

+1

请注意,这不适用于符合预处理器,因为符合预处理器是基于令牌的。将两个令牌合并为一个(例如,“L”和“bar”)的唯一方法是使用连接运算符('##'),它不能作为替换列表的最后一个符号出现。 – 2010-05-06 01:11:08

0

你得到它是预处理装置的错误信息您#define之前它什么都重要,它只是不知道它结束的意思(与L小号更换所有FOO年代后,它看起来什么L意味着无法弄清楚)。

编译器正在看到你的第二位代码,它只是不知道L"bar"在这一点上的含义。

你确定所有的东西都被定义和包含在内吗?

0

看看来自前处理(G ++ -E)输出

# 1 "ttt.cc" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "ttt.cc" 
int main() 
{ 

    const wchar_t *const foo = L "FOO"; 
} 

有后是一个空格L.

1

作为替代约翰的回答,我想你可以定义这个微软的方式_T()的定义是:

#define FOO(x)  L ## x 

,并使用它像这样:

FOO("bar") 

这将适当地连接L和文本。

+0

谢谢,我知道这件事。我已经使用了_T(和朋友),当遇到一些代码时,偶然发现了这个“问题”。 – blakecl 2010-04-28 02:30:02