我正在研究一个项目并遇到一个我认为可以用宏解决的问题,但考虑到问题的本质,我没有自己编写的经验。
这就是我期望的#define宏的输入和输出:
输入此代码
printf(foobar(Hello World.));
应该导致预处理器生成如下代码:
printf((char *)(std::string("")+'H'+'e'+'l'+'l'+'o'+' '+'W'+'o'+'r'+'l'+'d'+'.').c_str());
我假设这样复杂的事情是可能的,我希望你们中的一个能帮助我。
我需要它成为一个宏,我不希望任何地方的字符串不变。
答案 0 :(得分:2)
有一些尝试做这样的事情,但我担心这不完全是你所需要的:
C++: Can a macro expand "abc" into 'a', 'b', 'c'?
“更强大的预编译器”?
答案 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