eltonto187
V2EX  ›  问与答

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

By eltonto187 at 2018 年 7 月 5 日 · 3096 次点击
现在系统中有宏
#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)


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

lpc_uart[port] = xxx;
CannotGoogle
   3
CannotGoogle  
   2018 年 7 月 5 日
写错,static 后面忘加类型了。
eltonto187
   4
eltonto187  
OP
   2018 年 7 月 5 日 via iPhone
@CannotGoogle 文中有提到,每个 LPC_UART 的类型不同,数组已试过,无效
eltonto187
   5
eltonto187  
OP
   2018 年 7 月 5 日 via iPhone
@wevsty 回去试下,如果好好使,就太感谢了
changnet
   6
changnet  
   2018 年 7 月 5 日 via Android
一定要用宏的话,wevsty 正解。但是这样逻辑不应该是用数组来解决的么,即使类型不一样,换种思路,用 union 什么的也可以处理。你用宏相当于硬编码。

如果是老代码定的规则,当我没说
duzhe0
   7
duzhe0  
   2018 年 7 月 5 日
C 的宏是没有循环的
Arnie97
   8
Arnie97  
   2018 年 7 月 8 日 via Android
@wevsty 的说法是正确的,但是他的说法并不能解决你的问题(不能循环),还是要想办法统一成数组。这几个 IO 寄存器不一样长的话,可以考虑统一成 struct {void *ptr, size_t size} 或者 union {uint32_t *long, uint16_t *short} 之类的样式
© 2026 V2EX · 27ms · 3.9.8.5