C에서 매크로를 사용하는 것은 이번이 처음이며 매크로를 사용하여 일반적으로 함수에 배치하는 코드의 큰 부분을 대체하려고합니다. 이것은 자주 사용되는 인터럽트의 일부이므로 가능한 한 최대한 최적화해야합니다. 문서를 읽은 후에 컴파일러가 함수 인라이닝을 지원하지 않으며 함수 호출 오버 헤드를 피하기를 원합니다.이 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;\
\
}
그래서 내가 뭐하는 거지 잘못된
그래서 여기에 함수 형태로 내가 사용하는 코드이다?
업데이트 : 의견을 삭제했으며 다른 위치에서 구문 오류가 발생했습니다.
왜 함수를 매크로로 바꾸어야한다고 생각하십니까? 함수 호출 오버 헤드가 중요하다면 인라인 함수로 만드십시오. –
@ Paul R 내가 말했듯이, 컴파일러는 함수 인라이닝을 지원하지 않습니다. – AndrejaKo
...하지만 Paul이 말했듯이 함수 호출 오버 헤드가 중요합니다. 이것은 결국 한 줄 함수가 아닙니다. 나에게 [조기 최적화] (http://c2.com/cgi/wiki?PrematureOptimization)처럼 보입니다. – Clifford