2013-05-27 26 views
5

我有多个头文件,它们每个都必须在数组中附加一个数字来注册它的函数。C追加到头文件中的数组

目前我在每个头文件中都有一个唯一名称的函数,在程序文件中我需要在一个合并函数中调用所有这些函数。

int register1() { return 100; }; //in header1.h 
int register2() { return 200; }; //in header2.h 
int register3() { return 300; }; //in header3.h 
int register4() { return 400; }; //in header4.h 
int registered[] = {register1(),register2(),register3(),register4()}; //main.c 

但是这很不方便,因为我需要在两个地方修改时添加或删除头文件。最好只修改头文件。我在想一个预处理定义,所以在每个标题我就可以使用类似:

#define Registered Registered,100 // header1.h 
#define Registered Registered,200 // header2.h 
int registered[] = {Registered}; // main.c 

但是,这当然不会编译,因为新的定义重新定义旧的。那么有没有办法追加一个定义?或以其他方式将数字附加到数组而不修改两个文件?

这是C,而不是C++,否则我会使用带有构造函数的类实例来写入数组。 Somethink这样的:

struct __header1{ __header1() { 
    global_array[global_array_ptr++] = 100; 
} } __header1_inst; 

,然后将其转换为一个不错的宏:

#define register(hdr, func) struct __header##hdr{ __header##hdr() { \ 
     global_array[global_array_ptr++] = func; \ 
    } } __header##hdr##_inst; 

    register(1, 100) // header1.h 
    register(2, 200) // header2.h 
+0

我不认为这是可能的。如果您愿意,可以参考以下替代方法:http://stackoverflow.com/a/4152185/182748 – asveikau

+0

使阵列比您需要的大。 –

+1

'我有多个头文件,每个头文件都必须在数组中附加一个数字来注册它的函数。' 这就是问题出在哪里,这是糟糕的程序设计。在面向对象的设计中,每个模块应该是自治的,尽可能少的依赖关系。我不知道你的“寄存器”应该是什么,所以很难提出最好的程序设计,但是由于寄存器显然是相互关联的,它们应该由一个模块来处理。如果需要,寄存器模块可以包含在所有这些头文件中。 – Lundin

回答

1

恕我直言,这是一个黑客,我会建议反对。即使你可以在C中做到这一点,考虑一个这样的头文件被几个模块包含的情况。每个这样的模块在全局数组中都会有相同的条目。接下来,尽管可以用C++来完成,但全局对象初始化的顺序为is undefined,因此依赖全局数组内容的另一个全局对象的初始化将不可靠。

此外,这是一个非常复杂的方式来做一件简单的事情,并且相当模糊了它的含义。除了数组填充代码本身很复杂之外,当依赖关系变得微不足道时,跟踪包括将变得繁重。所以,只需将该全局数组明确地填充到特定位置即可。