4
#define A(a)  "str" ## a ## test
A(_)

根据17.6.4.3.5C++11 标准

不以下划线开头的文字后缀标识符保留用于将来的标准化。

上面的代码应该产生"str"_test一个有效的预处理令牌和它的类user-defined-string-literal

clang 3.0 在预处理器模式下运行时会产生错误-E

铿锵声给出:

pasting formed '"str"_', an invalid preprocessing token
A(_)
^
note: expanded from:
#define A(a)  "str" ## a ## test
                    ^

"str"_test
1 error generated.

我不明白是什么步骤使它决定结果不是无效的预处理令牌。

注意:我正在编写一个 c++11 预处理器。

4

1 回答 1

3

认为代码是有效的 C++11;看起来您正在使用不完整的 C++11 支持的编译器。

使用 g++ 版本 4.7.2 (with -std=c++11),这个人为的程序:

#include <cstddef>
#include <iostream>

#define A(a)  "str" ## a ## test

const char* operator"" _test(const char s[4], size_t size) {
    return s;
}

int main() {
    std::cout << A(_) << "\n";
}

编译没有错误并产生以下输出:

str

clang++ 3.0 版本不太开心;除其他错误外,它说:

c.cpp:11:18: error: pasting formed '"str"_', an invalid preprocessing token
    std::cout << A(_) << "\n";
                 ^
c.cpp:4:21: note: expanded from:
#define A(a)  "str" ## a ## test
                    ^
于 2013-06-19T18:27:37.390 回答