重用/递增C宏定义?

时间:2010-07-02 11:40:53

标签: c c-preprocessor

有办法吗?

#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();

4 个答案:

答案 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;

它并不试图将其视为参数列表,而只是作为单个参数。