【问题标题】:C++ Preprocessor string literal concatenationC++ 预处理器字符串文字连接
【发布时间】:2010-05-14 20:39:47
【问题描述】:

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

【问题讨论】:

  • 只是出于好奇 - 你为什么使用 char* 而不是 std::string?
  • @David Relihan:为什么会有人使用std::string 作为不可变字符串常量?甚至没有考虑到客户端代码规范(如某些 API)可能需要 char *
  • @AndreyT:“为什么会有人使用 std::string 作为不可变字符串常量?”因为他们想按字典顺序比较字符串(并且不想考虑它们是常量还是其他)?
  • 你可以写成"\000123..."。一个数字转义序列最多可以有三个八进制数字。第四个数字不包含在转义序列中;这是一个普通的角色。
  • @Rob:我没想到。不错的解决方案:)

标签: c++ concatenation c-preprocessor


【解决方案1】:

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

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

6 相邻的普通字符串字面量 标记是串联的。相邻宽 字符串文字标记是 串联。

【讨论】:

  • 对,我正在寻找一份详细说明 C++ 的文档。我没能找到——尽管我很容易找到了 C 细节。
  • AndreyT - 你忘了提到 "\0" 被转换为目标字符集 before 字符串文字被合并。这是手头问题的关键。
  • @D.Shawley:我没有立即理解它的重要性。你的意思是没有\0 部分仍然可以与12 部分合并并形成一个八进制字符文字\012?嗯...我想说这里的重要部分实际上是第 4 阶段,而不是第 5 阶段,此时每个字符串文字都被转换为独立的预处理标记。仅此一项就已经解决了\012 的潜在问题,不是吗?
【解决方案2】:

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

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

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

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

因此,转义序列(如\0)在第五阶段转换为执行字符集的成员,然后在第六阶段连接字符串文字。

【讨论】:

  • 对 - 我明白了。我的问题是这是否在 C/C++ 中是透明的。如果是这样,我可以在哪里参考该文档。
  • @ezpz:对不起;我错过了你对两者之间的兼容性感兴趣。是的,C 和 C++ 的结果是相同的;我已经添加了 C++ 标准中的语言,它实际上说了同样的话。您可以从这个问题中找到相关标准文档的获取位置:stackoverflow.com/questions/81656/…
  • +1 用于实际提及翻译的不同阶段,因为这就是 "\0" "12""\012" 不同的原因。
【解决方案3】:

因为 C++ 和 C 标准之间的协议。大多数(如果不是全部)C++ 实现使用 C 预处理器,所以是的,C++ 使用 C 预处理器。

【讨论】:

  • 更准确地说,C++ 标准和 C 标准在某些翻译阶段和预处理器指令中达成一致,并且我所知道的每个 C++ 实现都使用 C 预处理器。我喜欢保持标准所说的内容和实现的内容之间的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2017-04-02
相关资源
最近更新 更多