C 语言大佬们,关于宏的问题

2018-07-05 18:34:23 +08:00
 eltonto187
现在系统中有宏
#define LPC_UART0 xxx
#define LPC_UART1 yyy 每种类型不同
#define LPC_UART2 xxx
....

我要写一些初始化的函数,就要写
if (port==0) LPC_UART0=xxx 初始化设置不止一条
if (port==1) LPC_UART1=xxx


我要设置端口多,就要写一摸一样的代码很多,每种只是 LPC_UART(n)中的 n 不同。

有没有什么办法定义一个宏或者函数之类的,

能让我支持 UART(n) 这种形式,
或者 UART[n] 这种形式,

只要替换一下 n,样板代码只用写一遍。

我试过把所有 LPC_UART 都放到数组里,可是每种类型不同,没成功。
自己试着写过这种形式的宏,也不正确。

#define UART(n) LPC_UART(n)


各位大佬,有没有好的方法指点一下。
1684 次点击
所在节点    问与答
8 条回复
wevsty
2018-07-05 18:48:48 +08:00
#define UART(N) LPC_UART##N
这样就行了。
你使用 UART(1)的时候编译器会自动帮你替换成 LPC_UART1。
CannotGoogle
2018-07-05 19:00:44 +08:00
宏的作用只能到在预处理阶段,可能数组会比较方便:
static lpc_uart[] = {LPC_UART0, LPC_UART1, LPC_UART2, ...};

lpc_uart[port] = xxx;
CannotGoogle
2018-07-05 19:01:48 +08:00
写错,static 后面忘加类型了。
eltonto187
2018-07-05 19:14:26 +08:00
@CannotGoogle 文中有提到,每个 LPC_UART 的类型不同,数组已试过,无效
eltonto187
2018-07-05 19:15:28 +08:00
@wevsty 回去试下,如果好好使,就太感谢了
changnet
2018-07-05 19:38:06 +08:00
一定要用宏的话,wevsty 正解。但是这样逻辑不应该是用数组来解决的么,即使类型不一样,换种思路,用 union 什么的也可以处理。你用宏相当于硬编码。

如果是老代码定的规则,当我没说
duzhe0
2018-07-05 19:39:03 +08:00
C 的宏是没有循环的
Arnie97
2018-07-08 12:05:34 +08:00
@wevsty 的说法是正确的,但是他的说法并不能解决你的问题(不能循环),还是要想办法统一成数组。这几个 IO 寄存器不一样长的话,可以考虑统一成 struct {void *ptr, size_t size} 或者 union {uint32_t *long, uint16_t *short} 之类的样式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/468449

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX