我发现this关于 C 预处理器应该如何处理字符串文字连接(第6阶段)。但是,我找不到任何关于如何在C ++中处理它的内容(C ++是否使用 C 预处理器?)。
我问的原因是我有以下内容:
const char * Foo::encoding = "\0" "1234567890\0abcdefg";
其中encoding
是类Foo
的静态成员。如果没有串联的可用性,我就无法编写那样的字符序列。
const char * Foo::encoding = "\01234567890\0abcdefg";
由于\012
的解释方式,完全不同。
我无法访问多个平台,我很好奇我应该对上述内容始终正确处理有多大信心 - 即我总是得到{ 0, '1', '2', '3', ... }
答案 0 :(得分:10)
语言(C和C ++)没有“预处理器”。 “预处理器”作为单独的功能单元,是一个实现细节。如果由所谓的翻译阶段定义,则处理源文件的方式。 C语言和C ++中的一个阶段涉及连接字符串文字。
在C ++语言标准中,它在2.1中描述。对于C ++(C ++ 03),它是第6阶段
6相邻的普通字符串文字 令牌连接在一起。相邻宽 字符串文字标记是 级联。
答案 1 :(得分:6)
是的,它将按照您的描述进行处理,因为它处于第5阶段,
每个源字符集成员和转义序列的字符常量和 字符串文字转换为执行字符的相应成员 集(C99§5.1.1.2/ 1)
C ++ 03中的语言实际上是相同的:
字符文字和字符串文字中的每个源字符集成员,转义序列或通用字符名称都将转换为执行字符集的成员(C ++03§2.1/ 5)
因此,在第六阶段连接字符串文字之前,转义序列(如\0
)将转换为第五阶段执行字符集的成员。
答案 2 :(得分:0)
由于C ++和C标准之间的一致性。大多数(如果不是全部)C ++实现都使用C预处理器,所以是的,C ++使用C预处理器。