Macros C预处理器可以执行简单的字符串操作吗?

Macros C预处理器可以执行简单的字符串操作吗?,macros,c-preprocessor,Macros,C Preprocessor,这是C宏观古怪的问题 是否可以编写一个宏,该宏以字符串常量X(“…”)为参数,并计算相同长度的字符串Y,从而使Y的每个字符都是X的相应字符的[constant]算术表达式 这是不可能的,对吗?不,C预处理器将字符串文本视为单个标记,因此无法执行任何此类操作 您所要求的应该在实际的C代码中完成。如果您担心运行时性能并希望在编译时委派此固定任务,那么现代优化编译器应该成功地处理这样的代码-它们可以展开任何循环并预计算任何固定表达式,同时考虑代码大小和CPU缓存使用模式,而预处理器对此一无所知 另一方

这是C宏观古怪的问题

是否可以编写一个宏,该宏以字符串常量X(“…”)为参数,并计算相同长度的字符串Y,从而使Y的每个字符都是X的相应字符的[constant]算术表达式


这是不可能的,对吗?

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

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


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

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


因此,除非你的目标是一个
\u Pragma
,否则在预处理阶段做事情的唯一方法就是把它们写成标记序列,操纵它们,并在最后将它们串起来

一个更好的问题是:“为什么2011年人们仍然试图滥用C预处理器?”。这是一个好问题@Paul。滥用模板被称为“元编程”。一旦滥用预处理器获得了科学的、听起来神秘的名字,它将成为受人尊敬的、图书出版和扩展话题。我的条目是“语法变形”。但是你可以试着用更好的词来击败我。如果你使用perl作为预处理器…编译器不太可能在编译时用转换后的字符串替换字符串。编译时字符串操作有正当的理由。