通过预处理器填充数组?

时间:2018-06-01 13:18:39

标签: c preprocessor

嗨,对不起,如果已经在其他地方问过这个问题。

我有一个全局数组,我的代码是模块化的。每个模块都应该能够为全局数组添加一些处理程序。

基本上它看起来像这样:

    #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。

任何想法或提示?

2 个答案:

答案 0 :(得分:0)

IMO非常困难(如果可能)并且容易出错。

IMO每个模块都应该将自己的init处理程序添加到自己的init内存部分。这是正确和可调试的方式。然后在启动时,您可以按照您想要的方式启动所有模块。

您也可以这样创建表格。

答案 1 :(得分:0)

  

我有一个全局数组,我的代码是模块化的。

虽然并非完全不一致,但这两项说法并不能很好地协调一致。避免全球数据。

  

每个模块都应该能够为全局数组添加一些处理程序。

您的模块可以在运行时通过某种初始化函数执行此操作,但如果要在编译时通过阵列的初始化程序执行此操作,则需要帮助。数组定义将仅编译一次,并且其出现的转换单元需要知道数组大小及其所有初始值。不同的翻译单元是独立编译的。

  

所以我搜索并试图实现类似的东西:

ADD_ITEM(0,0);
     

这个想法是,宏ADD_ITEM应该简单地扩展到{0,0}和   这应该添加对象般的宏ITEMS。

您可以使用预处理器玩各种有趣的游戏,但这不是其中之一。除了独立的编译之外,宏的扩展不能改变另一个宏的定义。一个宏可以使用另一个,但这是另一回事。

如果您坚持使用全局数组作为数据,那么它的大小和初始内容将在编译时确定。如果你想根据包含哪些模块来配置那些模块,那么你需要某种代码生成来处理它,或者至少要引导它。