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

时间:2010-05-14 20:39:48

标签: c++ concatenation c-preprocessor

我发现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', ... }

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预处理器。