你能扩展#define';转换成字符串文字? 有没有办法让C++预处理器将一个定义的ED值扩展到字符串文字? 例如: #define NEW_LINE '\n' Printf("OutputNEW_LINE"); //or whatever

你能扩展#define';转换成字符串文字? 有没有办法让C++预处理器将一个定义的ED值扩展到字符串文字? 例如: #define NEW_LINE '\n' Printf("OutputNEW_LINE"); //or whatever,c++,c-preprocessor,C++,C Preprocessor,在我看来,这应该是可能的,因为它在编译之前? 或者有没有更好的设计模式来实现这种行为(而不必求助于sprintf之类的运行时修复) 编辑我理解#定义可能是邪恶的,但为了争论 另外有人对这种方法有任何批评吗?如果我没记错的话 Printf("Output" NEW_LINE); 这可以做到: #define NEW_LINE "\n" // Note double quotes Printf("Output" NEW_LINE); (从技术上讲,是编译器连接字符串,而不是预处理

在我看来,这应该是可能的,因为它在编译之前?
或者有没有更好的设计模式来实现这种行为(而不必求助于sprintf之类的运行时修复)

编辑我理解#定义可能是邪恶的,但为了争论


另外有人对这种方法有任何批评吗?

如果我没记错的话

Printf("Output" NEW_LINE);
这可以做到:

#define NEW_LINE "\n"         // Note double quotes
Printf("Output" NEW_LINE);

(从技术上讲,是编译器连接字符串,而不是预处理器,但最终结果是一样的。)

您可以执行以下操作

#define NEW_LINE "\n"
printf("Output" NEW_LINE);

printf("Output%s", NEW_LINE); 

应该这样做。

所以这将在构建时扩展,而不是通过Printf的格式化功能?是的,C编译器将自动连接相邻的字符串文字,尽管#define应该将新行定义为“\n”,而不是“\n”,我认为。+1可以抵消不必要的向下表决。(这不是我的反对票,但可能是因为代码无法与亚当问题中给出的“定义新行”\n(带单引号)一起工作。虽然很苛刻,但有可能。)没错,但从长远来看更容易维护:)嗯。。。不是真的,如果#define更改,那么您仍然需要重新编译所有内容,如果文本中的某些内容发生更改,那么丢失的逗号应该不会造成问题,因为您仍然可以添加占位符和变量,而不会破坏某些内容。至少在我看来。@GMan有“不那么难看”的替代方案吗?好吧,您可以直接在字符串中使用\n。C标准规定,至少在写入文本文件和控制台时,此单个字符将扩展为平台用作行分隔符/终止符的任何字符。
#define NEW_LINE "\n"
printf("Output" NEW_LINE); //or whatever