打印

请教下各位用C语言的前辈,关于连接符“\”

[复制链接]
5299|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nqyijian|  楼主 | 2011-10-6 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nqyijian 于 2011-10-6 15:07 编辑

各位前辈大家好,小弟有个问题想请教下各位。小弟最近在苦想怎么模块化的更好。所以我把中断函数单独拉出来,然后在各个需要中断的模块里面宏定义中断处理程序,
以后需要用该中断的时候,直接把宏定义加入到中断函数中就可以了,方便。
但是宏定义一大段指令的时候会遇到连接符的问题。不连接会出错。程序如下
#define USART_RX_INT\
{
      if(RCIF && RCIE)
     {
          u8 Temp;
          if(FERR)           //帧错误处理
         {
               Temp = RCREG;
          }
          else if(OERR)   //溢出错误处理
         {
               CREN = 0; //溢出错误直接复位接收模块
               CREN = 1;
         }
         else
        {
               RX_WritePointer++;
               if(RX_WritePointer > 15)
              {
                        RX_WritePointer = 0;
               }
              Usart_RC_data_buff[RX_WritePointer] = RCREG;
         }
     }
}

想请教下各位,我该在哪些地方添加连接符才对?我试过把它们写在同一行能编译过去,但是那样实在不好看。谢谢各位

相关帖子

沙发
nqyijian|  楼主 | 2011-10-6 19:08 | 只看该作者
怎么没有热心人回答一下啊

使用特权

评论回复
板凳
西安农民工| | 2011-10-6 19:27 | 只看该作者
在if中还可以定义u8 Temp吗?

使用特权

评论回复
地板
icecut| | 2011-10-6 19:39 | 只看该作者
俺不喜欢用宏定义。

使用特权

评论回复
5
sysdriver| | 2011-10-6 20:45 | 只看该作者
在if中还可以定义u8 Temp吗?
西安农民工 发表于 2011-10-6 19:27


难道是C++?

使用特权

评论回复
6
highgear| | 2011-10-6 22:19 | 只看该作者
这种做法不是很好, 模块化不是宏化。

连接符“\”,必须每一行的放一个,不仅仅是第一行。

使用特权

评论回复
7
祖平| | 2011-10-6 23:35 | 只看该作者
模块化时,可以用注册回调函数形式来封装

使用特权

评论回复
8
nqyijian|  楼主 | 2011-10-7 08:37 | 只看该作者
请问楼上注册回调函数是什么意思啊,怎么实现啊。

使用特权

评论回复
9
红金龙吸味| | 2011-10-7 14:49 | 只看该作者
注册回调函数,就是定义一个函数指针,然后需要将该指针指向你所要调用的函数。

ISR()
{
    if(g_pfnISRCallBack != NULL)
    {
           (*g_pfnISRCallBack)(NULL)//execute isr funciton  
    }
}

typedef void (*pfnISRCallBack)(void * pData);
//register isr callback function
void RegisterISRCallBack(pfnISRCallBack pfnISR)
{
    g_pfnISRCallBack = pfnISR;
}

模块化抓住一个要点就是模块与模块之间耦合性要低,模块自身内聚性要高。实现的思路多种多样。需要注意一点如果模块设计不好,会带来额外的资源消耗。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
10
potter| | 2011-10-7 15:21 | 只看该作者
不知道楼主是不是要这样的代码
#define USART_RX_INT   \

{ \
       if(RCIF && RCIE)\
      {\
           u8 Temp;\
           if(FERR)           /*帧错误处理*/ \
          {\
                Temp = RCREG;\
           }\
           else if(OERR)   /*溢出错误处理*/\
          {\
                CREN = 0; /*溢出错误直接复位接收模块*/ \
                CREN = 1;\
          }\
          else \
         {\
                RX_WritePointer++;\
                if(RX_WritePointer > 15)\
               {\
                         RX_WritePointer = 0;\
                }\
               Usart_RC_data_buff[RX_WritePointer] = RCREG;\
          }\
      }\
}

使用特权

评论回复
11
potter| | 2011-10-7 15:22 | 只看该作者
这样编译应该能过得

使用特权

评论回复
12
hjx5548| | 2011-10-7 16:34 | 只看该作者
宏定义

使用特权

评论回复
13
西安农民工| | 2011-10-7 17:25 | 只看该作者
在if中定义个变量,本身就就编不过。lz应该用的PICC编译器吧!
if(RCIF && RCIE)\
      {\
          u8 Temp;\

使用特权

评论回复
14
nqyijian|  楼主 | 2011-10-10 20:07 | 只看该作者
是的PICC的编译器,在if里面定义变量,可以正常使用啊

使用特权

评论回复
15
nqyijian|  楼主 | 2011-10-10 20:11 | 只看该作者
对于PIC单片机,堆栈数量固定了,太多的嵌套会出问题,所以不敢在中断里面再调用函数,不然容易堆栈溢出

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

539

帖子

1

粉丝