我有多个头文件,它们每个都必须在数组中附加一个数字来注册它的函数。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
我不认为这是可能的。如果您愿意,可以参考以下替代方法:http://stackoverflow.com/a/4152185/182748 – asveikau
使阵列比您需要的大。 –
'我有多个头文件,每个头文件都必须在数组中附加一个数字来注册它的函数。' 这就是问题出在哪里,这是糟糕的程序设计。在面向对象的设计中,每个模块应该是自治的,尽可能少的依赖关系。我不知道你的“寄存器”应该是什么,所以很难提出最好的程序设计,但是由于寄存器显然是相互关联的,它们应该由一个模块来处理。如果需要,寄存器模块可以包含在所有这些头文件中。 – Lundin