C ++翻译阶段混乱

时间:2010-04-28 02:12:00

标签: c++ c-preprocessor

有人可以解释为什么以下不起作用吗?

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"; 
}

如果有人能引用标准的解释,那就太好了。

4 个答案:

答案 0 :(得分:6)

使用:

#define FOO L\

没有尾随\L和宏替换字符串之间会有一个空格。这是g++ -E

的结果
const wchar_t* const foo = L "bar";

答案 1 :(得分:1)

作为John答案的替代方案,我认为您可以按照Microsoft的_T()定义方式来定义:

#define FOO(x)     L ## x

并像这样使用它:

FOO("bar")

这会将L与文本恰当地连接起来。

答案 2 :(得分:0)

您收到的错误消息表示它正在对#define进行预处理,然后才会执行其他操作,它只是不知道它最终意味着什么(在用{替换所有FOO之后{1}},它查找L的含义并且无法弄明白。

编译器正在查看您的第二位代码,它只是不知道L在那时的含义。

您确定所有内容都已正确定义并包含在内吗?

答案 3 :(得分: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之后还有一个空格。