字符串的复杂多参数#define宏

时间:2011-10-24 08:07:29

标签: c++ string c-preprocessor

我正在研究一个项目并遇到一个我认为可以用宏解决的问题,但考虑到问题的本质,我没有自己编写的经验。

这就是我期望的#define宏的输入和输出:

输入此代码

printf(foobar(Hello World.));

应该导致预处理器生成如下代码:

printf((char *)(std::string("")+'H'+'e'+'l'+'l'+'o'+' '+'W'+'o'+'r'+'l'+'d'+'.').c_str());

我假设这样复杂的事情是可能的,我希望你们中的一个能帮助我。

我需要它成为一个宏,我不希望任何地方的字符串不变。

5 个答案:

答案 0 :(得分:2)

呃,我担心这是不可能的(除非我不知道什么)。 我相信没有宏将拆分给定的输入令牌(例如Hello)转换为构建它的字符(H e l l o)

有一些尝试做这样的事情,但我担心这不完全是你所需要的:

C++: Can a macro expand "abc" into 'a', 'b', 'c'?


“更强大的预编译器”?

尝试此主题:Replacements for the C preprocessor

答案 1 :(得分:2)

我能想到的唯一解决方案是通过合适的脚本运行代码(可能只是一些轻量级awk),在代码到达预编译器之前进行替换。

根据您的环境,您可以在Visual Studio中将其作为“预构建事件”执行此操作,或者直接在makefile中添加步骤。

答案 2 :(得分:1)

宏基本上是替换或添加字符串。 您可以使用自己的预处理器执行此操作,但标准预处理器不会将字符串拆分为组件部分。

这个怎么样: 将所有这些(假设有多个)'宏'放在一个单独的文件中。编写一个程序,将它们转换为您需要的扩展,然后在您的c程序中包含该文件?然后,您可以将扩展程序作为make文件的一部分,以便它始终是最新的。 使用单独的文件使扩展程序比解析c / c ++文件容易得多。

答案 3 :(得分:1)

由于您正在寻找对您的问题进行简短而直接的回答而没有任何建议,所以请注意:

这是不可能的。你必须找到一个与你想要达到的目标不同的解决方案。

答案 4 :(得分:0)

你试过了吗?

#define toString(x) #x

您可以像这样使用它:

printf("%s", toString(hello world));

不要尝试直接使用printf字符串,因为你可以在字符串中使用格式说明符。

printf(toString(hello world)); //wrong, you can have for example %d in the string