gpt4 book ai didi

C追加到头文件中的数组

转载 作者:太空狗 更新时间:2023-10-29 15:08:14 26 4
gpt4 key购买 nike

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

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

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

但这很不方便,因为我在添加或删除头文件时需要修改两个地方。最好只修改头文件。我在考虑预处理器定义,所以在每个 header 中我可以使用类似的东西:

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

但这当然不会编译,因为新的定义重新定义了旧的。那么有没有办法附加一个定义?或者在不修改两个文件的情况下将数字附加到数组的其他方法?

这是 C,而不是 C++,否则我会使用一个带有构造函数的类实例,它只会写入一个数组。像这样的想法:

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

最佳答案

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

此外,这是一种非常复杂的方法来做一件简单的事情,而且相当模糊了意思。除了数组填充代码本身很复杂之外,当依赖关系变得微不足道时,跟踪包含也会变得很麻烦。因此,只需在特定位置显式填充该全局数组即可。

关于C追加到头文件中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16766228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com