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 (と-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 に答える