嗨,对不起,如果已经在其他地方问过这个问题。
我有一个全局数组,我的代码是模块化的。每个模块都应该能够为全局数组添加一些处理程序。
基本上它看起来像这样:
#define ITEMS
typedef struct {
uint8_t item0;
uint8_t item1;
} Item_t;
Item_t Items[]={ITEMS};
所以我搜索并试图实现类似的东西:
ADD_ITEM(0,0);
我的想法是,宏ADD_ITEM应该简单地扩展为{0,0},并且应该添加类似对象的宏ITEMS。
任何想法或提示?
答案 0 :(得分:0)
IMO非常困难(如果可能)并且容易出错。
IMO每个模块都应该将自己的init处理程序添加到自己的init内存部分。这是正确和可调试的方式。然后在启动时,您可以按照您想要的方式启动所有模块。
您也可以这样创建表格。
答案 1 :(得分:0)
我有一个全局数组,我的代码是模块化的。
虽然并非完全不一致,但这两项说法并不能很好地协调一致。避免全球数据。
每个模块都应该能够为全局数组添加一些处理程序。
您的模块可以在运行时通过某种初始化函数执行此操作,但如果要在编译时通过阵列的初始化程序执行此操作,则需要帮助。数组定义将仅编译一次,并且其出现的转换单元需要知道数组大小及其所有初始值。不同的翻译单元是独立编译的。
所以我搜索并试图实现类似的东西:
ADD_ITEM(0,0);
这个想法是,宏ADD_ITEM应该简单地扩展到{0,0}和 这应该添加对象般的宏ITEMS。
您可以使用预处理器玩各种有趣的游戏,但这不是其中之一。除了独立的编译之外,宏的扩展不能改变另一个宏的定义。一个宏可以使用另一个,但这是另一回事。
如果您坚持使用全局数组作为数据,那么它的大小和初始内容将在编译时确定。如果你想根据包含哪些模块来配置那些模块,那么你需要某种代码生成来处理它,或者至少要引导它。