C 通过预处理器填充数组?

C 通过预处理器填充数组?,c,preprocessor,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,

您好,如果您已经在其他地方问过这个问题,我很抱歉

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

基本上是这样的:

    #define ITEMS

    typedef struct {
      uint8_t item0;
      uint8_t item1;
    } Item_t;

    Item_t Items[]={ITEMS};
因此,我搜索并尝试实现如下内容:

    ADD_ITEM(0,0);
ADD_ITEM(0,0);
其思想是,宏ADD_项应该简单地扩展到{0,0},这应该添加到类似对象的宏项中

有什么想法或提示吗?

在我看来,这非常困难(如果可能的话),而且容易出错

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

也可以通过这种方式创建表

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

尽管并非完全不一致,但这两种说法并不完全一致。避免使用全球数据

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

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

因此,我搜索并尝试实现如下内容:

    ADD_ITEM(0,0);
ADD_ITEM(0,0);
其思想是,宏ADD_项应该简单地扩展到{0,0}和 这应该添加到类似对象的宏项中

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


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

如果您的想法是在每个模块中添加
,那么这几乎是不可能的。@EugeneSh。怎么做?怎么做?“几乎不”=否。放弃全局数组并使用setter/getter函数?您的意思是什么而不是:
#define ADD_ITEM(x,y){.item0=(x),.item1=(y)}
?您可以像
Item\u t Items[]那样使用它{ADD\u Item(0,0),ADD\u Item(1,0)}以更好地解释事情。我正在为AVR微控制器编写一些固件。在这种情况下,程序大小非常重要,我希望尽可能避免无用的调用。另外,我希望在运行时具有静态对象大小。我在考虑添加/使用某种预处理器。一些代码生成来解决这个问题。@erazor,你似乎在试图改变这个问题。我确实推荐代码生成作为单独使用预处理器的可行替代方案,但是,如果你希望了解具体情况,那么这将是一个完全不同的问题——需要做一些工作才能缩小到合适的宽度和范围。目前看来,通过宏扩展数组的简单方法根本不起作用,或者说是不可能的。代码大小很重要,因此我需要在编译之前构建数组。我会把这个问题保留一天左右,看看是否有人有好的解决方案。否则,与这个问题无关,我将使用/编程一个自定义预处理器,它不仅创建数组,而且还消除模块文件中的冗余。