2011-10-24 93 views
0

我正在研究一个项目,并有一个问题,我相信可以用宏来解决,但考虑到问题的性质,我没有经验来自己写一个。复杂的多参数#define宏的字符串

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

输入如下代码

printf(foobar(Hello World.)); 

应该导致预处理生产代码,上面写着:

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

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

我需要它是一个宏,我不想要一个字符串常量在任何地方。

+0

这基本上是一个“字符串常量”,除了终止零(尽管你有一个“”)。你试图达到什么目的,为什么你想避免字符串常量? – Nico

+2

我很害怕问在什么情况下这可能是有意义的......(你的实际请求是什么,让它产生特定的输出或在预处理器运行之前没有文字?) –

+0

仅供参考'std :: string()'是比std :: string(“”)'更好。你为什么要投“char *”?我对人们所做的所有聪明的事情感到惊讶,没有办法在宏中进行任何字符串操作。但真的,如果你不想听到这个,但是最好避免使用宏。 – tenfour

回答

2

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

根据您的环境,您可以在Visual Studio中将其作为“预生成事件”来完成,或者直接在makefile中添加一个步骤。

+0

这实际上是我现在正在处理的,因为它看起来不像预编译器能够做我需要的。 – Nowayz

2

呃,我担心这是不可能的(除非我不知道什么)。 我相信没有宏分裂给定的输入令牌(如你好)转换成字符构建它(H ELLO)

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

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


“更强大的预编译器”?

试试这个话题:Replacements for the C preprocessor

+0

我需要更强大的预编码器:( – Nowayz

+1

@Nowayz不,我确信你需要一个更好的目标 – tenfour

+1

或者给你的问题提供更多信息的背景... – Nico

1

宏基本上替换或字符串。 你可以用你自己的预处理器做到这一点,但标准预处理器不会将字符串拆分为组件。

这个怎么样: 把所有这些(假设有多个)'宏'放在一个单独的文件中。编写一个程序,将它们翻译成你所需要的扩展,然后在你的c程序中包含THAT文件?然后,您可以将扩展程序作为make文件的一部分,以便它始终处于最新状态。 使用单独的文件使扩展程序比解析c/C++文件更容易。

+0

我仍然需要它能够在飞行中工作,而不必修改或完全为一个字符串构建另一个函数。 – Nowayz

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 
+0

STRING CONSTANT DETECTED – Nowayz

+0

这会创建一个字符串不断,他是明确的它试图避免......无论出于何种原因 – Nico

+0

没有听起来太模糊..如果没有任何字符串常量,你不能找到任何字符串常量。这不仅仅是一些正常的生产代码,我意识到这个问题很奇怪。 – Nowayz

1

既然你正在寻找一个狭窄的,直接回答你的问题,不建议,这里有云:

这是不可能的。你必须找到一个不同的解决方案,无论你试图达到什么目的。