有办法吗?
#define A f1();
#define A A f2(); // this is wrong
#define A A f3(); // this is wrong
...
#define A A fn(); // this is wrong
A
然后获取
f1(); f2(); f3(); ... fn();
答案 0 :(得分:1)
您可以使用boost预处理器库。它可以迭代宏等等:
http://www.boost.org/doc/libs/1_43_0/libs/preprocessor/doc/index.html
编辑:我阅读了您的评论,并将继续关注解决方案比以下代码更容易;-):
#include <boost/preprocessor/repetition/repeat.hpp>
#define A(z, n, text) text ## n = 0;
BOOST_PP_REPEAT(3, A, int x)
生成
int x0 = 0; int x1 = 0; int x2 = 0;
请注意,这不是一个严格的解决方案,因为它没有定义重复另一个宏但重复已定义宏的宏。
答案 1 :(得分:0)
是强>
#define A f1();
#define B A f2(); // this is right
B
答案 2 :(得分:0)
写作时
#define foo [something]
如果在foo
中发现[something]
,则会被忽略。
所以看起来你不能用预处理器进行递归,并使用像BOOST_REPEAT这样的丑陋黑客,它通过列出丑陋的宏来“教导预处理器如何计算”。如果没有BOOST_REPEAT,你要求的并不简单。
答案 3 :(得分:0)
#define A f1();
...
#define TEMP_A A
#undef A
#define A TEMP_A f2();
#undef TEMP_A
...
虽然我建议你考虑这样做:
#define A f1()
// Note the lack of the semicolon
...
#define TEMP_A
#undef A
#define A do { TEMP_A; f2(); } while (0)
#undef TEMP_A
因为当你在代码中调用宏时,这会允许并强制你正确使用分号。
如果您的函数返回值并且您想要访问这些值,则会变得更复杂,但是您应该调查使用昏迷运算符。
#define A (( TEMP_A, f2() ))
这样,您就可以在A
f2()
之后TEMP_A
返回f1()
返回的值。双括号使得如果你做了一些愚蠢的事情:
printf A;
它并不试图将其视为参数列表,而只是作为单个参数。