在階段 3.標記化(Tokenization)中將輸入分析爲預處理記號,到某個給定字符爲止時,一般將可構成一個預處理記號的最長字符序列處理成下一個預處理記號,即便這會致使後繼分析失敗也是如此。這常被稱爲最大吞噬 (maximal munch)。spa
int foo = 1; int bar = 0xE+foo; // 錯誤:非法的預處理數字 0xE+foo int baz = 0xE + foo; // OK int quux = bar+++++baz; // 錯誤:bar++ ++ +baz,而非 bar++ + ++baz。
最大吞噬規則的惟一例外是:.net
#define R "x" const char* s = R"y"; // 非良構的原始字符串字面量,而非 "x" "y" const char* s2 = R"(a)" "b)"; // 原始字符串字面量後隨普通字符串字面量
struct Foo { static const int v = 1; }; std::vector<::Foo> x; // OK,<: 未被看成 [ 的代用記號 extern int y<::>; // OK,同 extern int y[]。 int z<:::Foo::value:>; // OK,int z[::Foo::value]; |
(C++11 起) |
#include
指令中造成。std::vector<int> x; // OK,<int> 不是頭文件名