[技术问答] keil 编译器编译 N76E003关于宏定义出现的奇怪问题

[复制链接]
1731|12
 楼主| 18576478035 发表于 2018-11-1 16:52 | 显示全部楼层 |阅读模式
#define     InputSDIO()                                     (P00_Input_Mode;set_P0S_0;)
使用宏定义的时候 加括号就会报错 SOURCE\CMT2300\CMT2300.C(420): error C141: syntax error near ';'
#define     InputSDIO()                                     P00_Input_Mode;set_P0S_0;
不加括号就不会报错这是为什么?
tuoxieshu 发表于 2018-11-1 17:13 来自手机 | 显示全部楼层
大哥,分号请放在最后,谢谢
 楼主| 18576478035 发表于 2018-11-1 17:32 | 显示全部楼层
tuoxieshu 发表于 2018-11-1 17:13
大哥,分号请放在最后,谢谢

什么意思 ,我这是两句话啊 而且
#define     InputSDIO()                                     (P00_Input_Mode set_P0S_0) ;
#define     InputSDIO()                                     (P00_Input_Mode ,set_P0S_0) ;
#define     InputSDIO()                                     (P00_Input_Mode set_P0S_0;)
都不行
 楼主| 18576478035 发表于 2018-11-1 17:35 | 显示全部楼层
tuoxieshu 发表于 2018-11-1 17:35 来自手机 | 显示全部楼层
调用的地方贴出来看看,宏定义单纯就是文本替换,替换以后你看语法上有没有问题。
 楼主| 18576478035 发表于 2018-11-1 17:46 | 显示全部楼层
u8 bSpi3ReadByte(void)
{
        u8 RdPara = 0;
        u8 bitcnt;
  
        ClrCSB();
        InputSDIO();                       
          InputSDIO();               
        for(bitcnt=8; bitcnt!=0; bitcnt--)
                {
                ClrSDCK();
                RdPara <<= 1;
                Delay_10us(SPI3_SPEED);
                SetSDCK();
                Delay_10us(SPI3_SPEED);
                if(SDIO_H())
                        RdPara |= 0x01;
                else
                        RdPara |= 0x00;
                }
        ClrSDCK();
        OutputSDIO();
        OutputSDIO();
        SetSDIO();
        SetCSB();                       
        return(RdPara);       
}
 楼主| 18576478035 发表于 2018-11-1 17:47 | 显示全部楼层
每次都是在我调用的地方报错
tuoxieshu 发表于 2018-11-1 18:28 来自手机 | 显示全部楼层
这里为什么要加括号,没有优先级的计算。。。
tuoxieshu 发表于 2018-11-1 18:31 来自手机 | 显示全部楼层
另外,调用的地方不需要再加分号的,去掉试试。再就是如果没有特殊需要宏的名字里也别加括号
戈卫东 发表于 2018-11-1 18:41 | 显示全部楼层
圆括弧不可以那么用。。
戈卫东 发表于 2018-11-1 18:41 | 显示全部楼层
{花括弧}就没有问题
 楼主| 18576478035 发表于 2018-11-2 14:24 | 显示全部楼层
明白,()属于运算符,用语句块{}就没问题了
linqing171 发表于 2018-11-2 22:08 | 显示全部楼层
把宏
#define     InputSDIO()                                     (P00_Input_Mode;set_P0S_0;)
替换到下面的代码中
ClrCSB();
        InputSDIO();                        
          InputSDIO();     
替换后变为:
ClrCSB();
        (P00_Input_Mode;set_P0S_0;);                        
          (P00_Input_Mode;set_P0S_0;);     

报错是对的。
不报错才不对。
括号里不能有语句。

i=3 不带分号,是个表达式。
i=3; 带分号,就是个表达式加分号组成的语句了。
表达式可以加括号,可以赋值给一个变量。但是语句不可以。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

187

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部