打印
[技术问答]

keil 编译器编译 N76E003关于宏定义出现的奇怪问题

[复制链接]
1450|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 | 只看该作者
求助

使用特权

评论回复
5
tuoxieshu| | 2018-11-1 17:35 | 只看该作者
调用的地方贴出来看看,宏定义单纯就是文本替换,替换以后你看语法上有没有问题。

使用特权

评论回复
6
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);       
}

使用特权

评论回复
7
18576478035|  楼主 | 2018-11-1 17:47 | 只看该作者
每次都是在我调用的地方报错

使用特权

评论回复
8
tuoxieshu| | 2018-11-1 18:28 | 只看该作者
这里为什么要加括号,没有优先级的计算。。。

使用特权

评论回复
9
tuoxieshu| | 2018-11-1 18:31 | 只看该作者
另外,调用的地方不需要再加分号的,去掉试试。再就是如果没有特殊需要宏的名字里也别加括号

使用特权

评论回复
10
戈卫东| | 2018-11-1 18:41 | 只看该作者
圆括弧不可以那么用。。

使用特权

评论回复
11
戈卫东| | 2018-11-1 18:41 | 只看该作者
{花括弧}就没有问题

使用特权

评论回复
12
18576478035|  楼主 | 2018-11-2 14:24 | 只看该作者
明白,()属于运算符,用语句块{}就没问题了

使用特权

评论回复
13
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

粉丝