gpt4 book ai didi

C 预处理器宏

转载 作者:行者123 更新时间:2023-11-30 16:12:21 26 4
gpt4 key购买 nike

问题:

我正在为微 Controller 项目中的 LCD 编写通用 C 库。最多可以添加8个不同地址(例如LCD3和LCD7)的不同尺寸(例如128*96或64*48)的LCD。但一次只有其中之一是主动编码的。所以我想到了一种机制来做到这一点。

在代码中,有CLCD_ROWS和CLCD_COLS的定义,它们对应于事件显示尺寸。

#define CLCD_ROWS   // Active LCD rows
#define CLCD_COLS // Active LCD columns

还有各种 LCD 的定义。例如,如果我们连接了 LCD3 和 LCD7,我们可以使用以下命令定义它们的尺寸:

#define CLCD_ROWS3  96
#define CLCD_COLS3 64

#define CLCD_ROWS7 128
#define CLCD_COLS7 32

问题:

我编写了一个[错误的]宏来重新定义 CLCD_ROWS 和 CLCD_COLS 的值:

#define cLcd_setActiveI2CcLcd(X)    \
CLCD_ROWS = CLCD_ROWS##X \
CLCD_COLS = CLCD_COLS##X

在我的主代码中我调用宏:

cLcd_setActiveI2CcLcd(7);

这给了我一个错误“missing ;”。

用变量来实现很容易。但由于这些值是硬编码的,我认为它们是“可预处理的”,因为低端 MCU 中需要所有 RAM。

  1. 我对这些值进行预处理的方法正确吗?
  2. 为此目的编写宏的正确方法是什么?

我使用的是 C99 编译器。

最佳答案

首先,您使用函数类型宏的方法是错误的。即使您修复了错误,宏也不会执行 CLCD_ROWS 等于 CLCD_ROWS7 的操作,而是执行 CLCD_ROWSX (这就是宏的工作原理,它连接你给出的东西,而不是它的值)。相反,如果您想使用宏来减少 RAM 使用量,您可以将代码更改为:

第一个解决方案

#define ROW_COLS 7 // change this if you use different display

#if ROW_COLS == 7

#define CLCD_ROWS 128
#define CLCD_COLS 32

#elif ROW_COLS == 3

#define CLCD_ROWS 96
#define CLCD_COLS 64

#endif

第二个解决方案如果你想在运行时动态改变显示的大小,你可以这样做:

static int display_cnt;

#define CLCD_ROWS ((display_cnt == 3) ? 96 : 128)
#define CLCD_COLS ((display_cnt == 3) ? 64 : 32)

因此,当您更改 display_cnt 变量的值时,宏将自动更改其值。

关于C 预处理器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58352169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com