0

我想自动收集开始 FUN_BEGIN() 和 FUN_END() 宏的函数列表,如果我把它写成:

FUN_BEGIN()

FUN_DEFINE(f1) {
    printf("f1\n"); }

FUN_DEFINE(f2) {
    printf("f2\n"); }

FUN_DEFINE(f3) {
    printf("f3\n"); }

FUN_END()

代码将展开如下:

static bool f1(void) 
{
    printf("f1\n");
}

static bool f2(void)
{
    printf("f2\n");
}


static bool f3(void)
{
    printf("f3\n");
}


void global_fun(void)
{
    f1();
    f2();
    f3();
}

我可以释放它吗?

4

3 回答 3

3

这是一种使用构造函数添加到列表的方法,允许您使用的确切语法。

#define FUN_BEGIN() struct __fun_list { \
    struct __fun_list *next; \
    bool (*f)(void); \
} *head = NULL; \
static void globals_list_add(bool (*f)(void)) { \
    /* add f to the linked list... */ \
}

#define FUN_DEFINE(f) static bool f(void);\
    static void __attribute__((constructor)) __construct_##f(void) {\
        globals_list_add(f); \
    } \
    static bool f(void)

#define FUN_END() void global_fun(void) { \
    struct __fun_list *cur; \
    for(cur = head; cur; cur = cur->next) { \
        cur->f(); \
    } \
}

请注意,构造函数不一定按照它们声明的顺序调用,因此您可能需要__LINE__在宏中使用定义的行号对列表进行排序。

于 2013-04-15T04:13:06.607 回答
0

一种选择可能是将您的定义放在单独的文件中

funcs.def

FUN_DEFINE(f1) {
    printf("f1\n"); }

FUN_DEFINE(f2) {
    printf("f2\n"); }

FUN_DEFINE(f3) {
    printf("f3\n"); }

然后在不同的源文件中,执行类似的操作

#define FUN_DEFINE(name) static bool name(void)
#include "funcs.def"
#undef FUN_DEFINE

void global_fun(void) {
#define FUN_DEFINE(name) name();
#include "funcs.def"
#undef FUN_DEFINE
}

这种方法有一个名字,但我不记得了。

于 2013-04-15T03:41:08.547 回答
0

替代解决方案:

typedef bool (*func_t) (void);

// ...place function prototypes anywhere in scope

funct_t test_functions [] = 
{
  &f1,
  &f2,
  &f3
};

#define TEST_FUNCTIONS_N (sizeof(test_functions) / sizeof(funct_t))

void global_fun(void)
{
  for(size_t i=0; i<TEST_FUNCTIONS_N; i++)
  {
    test_functions[i]();
  }
}
于 2013-04-22T19:30:15.163 回答