【问题标题】:Fill array via preprocessor?通过预处理器填充数组?
【发布时间】:2018-11-11 15:39:21
【问题描述】:

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

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

基本上是这样的:

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

有什么想法或提示吗?

【问题讨论】:

  • 如果您的想法是在每个模块中添加ADD_ITEM - 那么几乎不可能。
  • @EugeneSh。怎么样?
  • 怎么样? “几乎没有”= 没有或没有。
  • 抛弃全局数组并使用setter/getter函数?
  • 你的意思是不是:#define ADD_ITEM(x,y) {.item0=(x),.item1=(y)}?您可以像Item_t Items[]={ADD_ITEM(0,0),ADD_ITEM(1,0)}; 一样使用它

标签: c preprocessor


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    尽管并非完全不一致,但这两种说法并不能很好地结合在一起。避免使用全局数据。

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

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

    所以我搜索并尝试实现类似:

    ADD_ITEM(0,0);
    

    这个想法是,宏 ADD_ITEM 应该简单地扩展为 {0,0} 并且 这应该被添加到类似对象的宏项目中。

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

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

    【讨论】:

    • 为了更好地解释事情。我正在为 AVR 微控制器编写一些固件。在这种情况下,程序大小很重要,我想尽可能避免无用的调用。另外,我想在运行时拥有静态对象大小。我正在考虑添加/使用某种预处理器。某种代码生成来解决这个问题。
    • @erazor,你似乎想改变这个问题。我确实并且确实建议将代码生成作为单独使用预处理器的可行替代方案,但是如果您希望获得细节,那将是一个完全不同的问题——而且需要一些工作才能缩小到合适的广度和范围。
    • 目前看来,通过宏扩展我的数组的简单方法根本不起作用或不可能。代码大小很重要,所以我需要在编译之前构建数组。我将把这个问题开放大约一天,看看是否有人有一个很好的解决方案。否则,与这个问题无关,我将使用/编程一个自定义预处理器,它不仅可以创建我的数组,还可以消除我的模块文件中的冗余。
    猜你喜欢
    • 2020-12-27
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多