【问题标题】:Can the C preprocessor perform simple string manipulation?C 预处理器可以执行简单的字符串操作吗?
【发布时间】:2011-04-08 21:13:14
【问题描述】:

这是C宏怪问题。

是否可以编写一个宏,以字符串常量 X ("...") 作为参数并计算相同长度的字符串 Y,使得 Y 的每个字符都是 X 的相应字符的 [常量] 算术表达式。

这是不可能的,对吧?

【问题讨论】:

  • 一个更好的问题应该是:“为什么在 2011 年人们仍在试图滥用 C 预处理器?”。
  • 这是个好问题@Paul。滥用模板被称为“元编程”。一旦滥用预处理器获得科学的、听起来神秘的名字,它就会成为受人尊敬的、出版书籍和扩展的话题。我的条目是“语法变形”。但是你可以试着用你更好的话打败我。
  • 如果你使用 perl 作为预处理器 ...

标签: macros c-preprocessor


【解决方案1】:

不,C 预处理器将字符串文字视为单个标记,因此它无法执行任何此类操作。

您所要求的应该在实际的 C 代码中完成。如果您担心运行时性能并希望在编译时委派这个固定任务,现代优化编译器应该可以成功处理这样的代码——它们可以展开任何循环并预先计算任何固定表达式,同时考虑代码大小和 CPU 缓存使用将模式考虑在内,而预处理器对此一无所知。

另一方面,您可能希望您的代码包含这样一个修改后的字符串文字,但不想要或不需要原始的 - 例如您想要程序将解码的模糊文本,并且您不希望在可执行文件中包含原始字符串。在这种情况下,您可以使用一些构建系统脚本来执行此操作,例如,使用另一个 C 程序来生成修改后的字符串,并将它们定义为实际程序的 C 编译器命令行中的宏。

【讨论】:

  • 编译器不太可能在编译时用转换后的字符串替换字符串。
  • 编译时字符串操作有正当理由。
【解决方案2】:

正如其他人所说,预处理器将整个字符串视为标记。 _Pragma 运算符只有一个例外,它将字符串作为参数并将其内容标记化以将其传递给 #pragma 指令。

因此,除非您以_Pragma 为目标,否则在预处理阶段做事的唯一方法是将它们编写为标记序列,对其进行操作并在最后对其进行字符串化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2016-03-20
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    相关资源
    最近更新 更多