【问题标题】:How to malloc a preprocessor directives如何 malloc 预处理器指令
【发布时间】:2017-01-21 08:05:44
【问题描述】:

我有一个如下宏。

#define WR_BLK_SIZE_REGINFO 123

我在库项目 (.a) 中使用此宏。库项目是预编译的,其中“WR_BLK_SIZE_REGINFO”的大小无法更改,因为它是在库项目中静态分配的。

现在如何动态分配预处理器指令代码?

我想要像下面这样的东西。这可能吗?

#define WR_BLK_SIZE_REGINFO malloc

如果感到困惑,让我简要介绍一下。

- 这个宏的用途是什么?

Ans: 这个宏用于我的库项目的各种文件中。为了降低代码复杂度,我使用宏来修复大小

  • 为什么要 malloc 宏?

Ans:我正在做一个库项目,这个库项目将在许多控制器中使用。每个控制器都有自己的内存集。所以我不能静态地修复那个宏的大小。因为它需要根据控制器的内存而变化。

演示一些代码?

Sample.h

#define WR_BLK_SIZE_REGINFO 123

sample.c

if( !((numItems >= 1) && (numItems <= WR_BLK_SIZE_REGINFO)) )
{
    // logic            
}

sample1.c

if( !((numItemsWrite >= 1) && (numItemsWrite <= WR_BLK_SIZE_REGINFO)) )
{
    // logic    
}

注意1:以上所有文件都是预编译的库文件,“123”在这里是固定的,我不希望它被修复。我想动态分配。

注意2:我不确定 malloc 是否是正确的选择。我只需要在库项目的运行时或应用程序项目的编译期间输入“123”(从应用程序项目到库项目输入 123)

注意3:库项目是使用MPLAB X IDE构建的,基本上它是一个微芯片项目。

【问题讨论】:

  • 为什么不只是int WR_BLK_SIZE_REGINFO = 123;
  • 我需要宏,因为 WR_BLK_SIZE_REGINFO 已在 1000 个地方使用,并且在不同的文件中至少有大约 10-15 个文件
  • 这与宏的工作方式相同,不是吗?您显示的示例代码应该仍然有效。当然,任何假定 WR_BLK_SIZE_REGINFO 是编译时间常数的代码都必须重写,但这是不可避免的。
  • 这是有道理的。不过,您对 malloc w.r.t 的看法是什么? int WR_BLK_SIZE_REGINFO = 123;我们不能使用编译时间动态分配这 123 吗?
  • 老实说,我不知道你在说什么。您有一些空间来存储旧值,代码希望在其中获取该值。您希望它看起来相同并获得新值。因此,您需要将存储的值(在他们正在查找的位置)从旧值更改为新值。分配从何而来?

标签: c malloc microchip mplab .a


【解决方案1】:

在 sample.h 中:

int get_wr_blk_size(void);
#define WR_BLK_SIZE_REGINFO get_wr_blk_size()

在某处的某个 C 文件中

static int wr_blk_size = 123;
static int set_wr_blk_size(int j) { wr_blk_size = j; }
int get_wr_blk_size(void) { return wr_blk_size; }

请注意,任何假定 WR_BLK_SIZE_REGINFO 是编译时常量的代码都必须重写,因为它不再是。

【讨论】:

  • 在这个特定的解决方案中,为什么不直接使用#define WR_BLK_SIZE_REGINFO wr_blk_size
  • 那么你就不会像你想要的那样得到像 x = WR_BLK_SIZE_REGINFO++;foo(&amp;WR_BLK_SIZE_REGINFO) 这样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多