C 语言大佬们,关于宏的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
eltonto187
V2EX    问与答

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

  •  
  •   eltonto187 2018-07-05 18:34:23 +08:00 via iPhone 2271 次点击
    这是一个创建于 2656 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在系统中有宏
    #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     Solana     5831 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 06:30 PVG 14:30 LAX 23:30 JFK 02:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86