C++预处理器字符串文字串联

ezp*_*zpz 6 c++ concatenation c-preprocessor

我发现这是关于C预处理器应如何处理字符串文字串联(第6阶段).但是,我找不到任何关于如何在C++中处理它的东西(C++是否使用C预处理器?).

我问的原因是我有以下几点:

const char * Foo::encoding = "\0" "1234567890\0abcdefg";
Run Code Online (Sandbox Code Playgroud)

where encoding是类的静态成员Foo.如果没有连接的可用性,我就无法编写那样的字符序列.

const char * Foo::encoding = "\01234567890\0abcdefg";
Run Code Online (Sandbox Code Playgroud)

由于\012解释方式,完全不同的东西.

我无法访问多个平台,我很好奇我应该如此自信,以上总是处理正确 - 即我将永远得到 { 0, '1', '2', '3', ... }

AnT*_*AnT 10

语言(C和C++)没有"预处理器"."预处理器"作为单独的功能单元,是一个实现细节.如果由所谓的翻译阶段定义,则处理源文件的方式.C语言和C++中的一个阶段涉及连接字符串文字.

在C++语言标准中,它在2.1中描述.对于C++(C++ 03),它是第6阶段

6连接相邻的普通字符串文字标记.相邻的宽字符串文字标记是连接的.


Jam*_*lis 6

是的,它将按照您的描述进行处理,因为它处于第5阶段,

字符常量和字符串文字中的每个源字符集成员和转义序列都将转换为执行字符集的相应成员(C99§5.1.1.2/ 1)

C++ 03中的语言实际上是相同的:

字符文字和字符串文字中的每个源字符集成员,转义序列或通用字符名称都将转换为执行字符集的成员(C++03§2.1/ 5)

因此,\0在第六阶段串联字符串文字之前,转义序列(如)将转换为第五阶段中执行字符集的成员.