2

这是我第一次在 C 中使用宏,我试图用宏替换我通常放入函数中的大部分代码。这是一个经常使用的中断的一部分,因此我需要尽可能地优化它。阅读文档后,我发现编译器不支持函数内联,我想避免函数调用开销。

代码本身将数据发送到串行输入并行输出移位寄存器,据我所知,没有更短的方法可以编写我需要的代码。

我正在使用 C18 编译器版本 3.41 和 MPLAB X IDE。

所以这是我以函数形式使用的代码:

void first_one(void)
{
   //3 invisible zeroes
            LATBbits.LATB1=0; //data set to zero

            LATBbits.LATB0=1;//first clock
            LATBbits.LATB0=0;

            LATBbits.LATB0=1;//second clock
            LATBbits.LATB0=0;

            LATBbits.LATB0=1;//third clock
            LATBbits.LATB0=0;
            //end of invisible zeroes

            //two visible zeroes    
            LATBbits.LATB0=1;//first clock
            LATBbits.LATB0=0;

            LATBbits.LATB0=1;//second clock
            LATBbits.LATB0=0;
            //end of two visible zeroes

            LATBbits.LATB1=1;//Data is now one

            LATBbits.LATB0=1;
            LATBbits.LATB0=0;
            //one 

            LATBbits.LATB1=0;//Data is now zero

            LATBbits.LATB0=1;//first clock
            LATBbits.LATB0=0;

            LATBbits.LATB0=1;//second clock
            LATBbits.LATB0=0;

            //after this, everything should be in place
            LATBbits.LATB0=1;
            LATBbits.LATB0=0;
}

我已经把函数变成了这个宏:

#define first_one() {  \
\
            LATBbits.LATB1=0;\               
                              \
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
                                \
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
                            \
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
            \                                
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
            \
            LATBbits.LATB1=1;\
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\    
\
            LATBbits.LATB1=0;\
             ^^^ The syntax error is here!
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
\
            LATBbits.LATB0=1;\
            LATBbits.LATB0=0;\
\
                     }

那么我做错了什么?

更新:我删除了评论,现在在不同的位置出现语法错误。

4

4 回答 4

8

检查标记后没有空格\,一些编译器为此发出编译错误。

于 2012-05-05T17:03:13.577 回答
3

在删除注释之前拼接行,因此\in \//3 invisible zeroes 不会继续该行。

您需要删除注释或使用 C 样式注释 ( /* 3 invisible zeroes */) 并将注释放在继续该行的之前。\

于 2012-05-05T16:40:37.583 回答
1

问题在于注释和预处理器处理它们的方式。删除评论,这应该可以正常工作。或者使用 /* 注释 */

于 2012-05-05T16:47:07.817 回答
1

三个建议:

首先,确保每个\.

其次,()如果它不打算接受任何参数,请从宏名称中删除。 根据下面的评论进行编辑。

最后,将宏的内容包装在 a 中do {...} while(0)(没有尾随分号)。这样,当您编写first_one();代码时,右大括号后就不会出现虚假的分号。

简而言之,

#define do_first         \
  do {                   \
    LATBbits.LATB0 = 1;  \
    ...                  \
  } while(0)

编辑Lundin 指出这是过时且不必要的。我一直认为,如果宏扩展为形式的语句,则需要避免诊断{...};——显然我错了。不过,我仍然更喜欢它作为一种风格选择。

于 2012-05-05T17:17:38.320 回答