V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
eltonto187
V2EX  ›  问与答

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

  •  
  •   eltonto187 · 2018-07-05 18:34:23 +08:00 via iPhone · 1880 次点击
    这是一个创建于 2366 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在系统中有宏
    #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-07-05 18:48:48 +08:00
    #define UART(N) LPC_UART##N
    这样就行了。
    你使用 UART(1)的时候编译器会自动帮你替换成 LPC_UART1。
    CannotGoogle
        2
    CannotGoogle  
       2018-07-05 19:00:44 +08:00
    宏的作用只能到在预处理阶段,可能数组会比较方便:
    static lpc_uart[] = {LPC_UART0, LPC_UART1, LPC_UART2, ...};

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

    如果是老代码定的规则,当我没说
    duzhe0
        7
    duzhe0  
       2018-07-05 19:39:03 +08:00
    C 的宏是没有循环的
    Arnie97
        8
    Arnie97  
       2018-07-08 12:05:34 +08:00 via Android
    @wevsty 的说法是正确的,但是他的说法并不能解决你的问题(不能循环),还是要想办法统一成数组。这几个 IO 寄存器不一样长的话,可以考虑统一成 struct {void *ptr, size_t size} 或者 union {uint32_t *long, uint16_t *short} 之类的样式
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1344 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:50 · PVG 07:50 · LAX 15:50 · JFK 18:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.