2012-05-05 4 views
2

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;\ 
\ 
        } 

그래서 내가 뭐하는 거지 잘못된

그래서 여기에 함수 형태로 내가 사용하는 코드이다?

업데이트 : 의견을 삭제했으며 다른 위치에서 구문 오류가 발생했습니다.

+0

왜 함수를 매크로로 바꾸어야한다고 생각하십니까? 함수 호출 오버 헤드가 중요하다면 인라인 함수로 만드십시오. –

+0

@ Paul R 내가 말했듯이, 컴파일러는 함수 인라이닝을 지원하지 않습니다. – AndrejaKo

+1

...하지만 Paul이 말했듯이 함수 호출 오버 헤드가 중요합니다. 이것은 결국 한 줄 함수가 아닙니다. 나에게 [조기 최적화] (http://c2.com/cgi/wiki?PrematureOptimization)처럼 보입니다. – Clifford

답변

8

\ 토큰 뒤에 공백이 있는지 확인하십시오. 일부 컴파일러에서는이 경우 컴파일 오류가 발생합니다.

+0

공백을 검사하여 오류가 없는지 확인하고 오류가 계속 발생했는지 확인합니다. – AndrejaKo

+0

실제로 이것은 이것이 문제라는 것이 밝혀졌습니다. IDE를 몇 번 재시작하고 프로그램이 잘 컴파일 된 것을보고 나면 처음에했던 것처럼'\'뒤에 공백을 추가하여 구문 오류가 발생했습니다. – AndrejaKo

+2

다음은 팁입니다 : 편집기에서 매크로의 모든 텍스트를 선택/강조 표시하십시오. 후행 공백은 문제가되는 행의 끝에 색상 블록으로 표시됩니다. 게시 된 질문의 텍스트를 사용하여 문제를 해결할 수도 있습니다. – Clifford

3

주석이 제거되기 전에 라인이 연결되어 있기 때문에 이 \//3 invisible zeroes 인 경우 줄을 계속 지우지 않습니다.

당신은 라인을 계속 \ 전에 주석 을 주석을 제거하거나 C 스타일의 주석 (/* 3 invisible zeroes */)를 사용하고 배치 중 하나가 필요합니다.

+0

주요 문제는 댓글이 아닌 것 같습니다. 나는 그들을 제거하고 여전히 구문 오류가 발생하고 있습니다. – AndrejaKo

+0

구문 오류 란 무엇입니까? 전처리 된 소스를보고 무엇이 잘못되었는지 확인하십시오 (gcc 및 Visual C++에서'-E'로 컴파일하십시오). –

+0

구문 오류는 '오류 : 구문 오류'이므로 매우 도움이되지 않습니다. Visual Studio와 GCC는 현재 코드를 작성중인 플랫폼을 지원하지 않습니다. – AndrejaKo

1

문제는 의견과 방법 그들과 함께 전처리 거래와 함께입니다. 주석을 제거하면 정상적으로 작동합니다. 다른 이름으로 사용/* 주석 */

1

세 가지 제안 :

먼저, 각 \ 후 모든 후행 공백이없는 있는지 확인하십시오. 이 모든 인수를 의미 있지 않은 경우

둘째, 매크로 이름에서 () 놓습니다. 편집 아래의 설명에 따라 다릅니다.

마지막으로, (아무 후행 세미콜론)을 do {...} while(0)에 매크로의 내용을 포장. 이렇게하면 코드에 first_one();을 쓸 때 닫는 중괄호 뒤에 가짜 세미콜론이 생기지 않습니다. 한마디로

,

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

편집 룬딘은이 구식과 불필요하다고 지적한다. 나는 항상 매크로가 형태가 {...}; 인 문장으로 확장 되었다면 진단을 피할 필요가 있다고 믿었다. 분명히 틀렸다. 나는 아직도 그것을 문체 선택으로 선호한다.

+4

인수를 사용하지 않아도 함수처럼 작동해야하는 매크로에서()를 생략하지 않습니다. 코드가 명확하게 보이도록 (이는 단순한 기호가 아닌) 명령문과 같은 기능입니다. –

+0

매크로에 대해서는 항상 C처럼 보이게하고, 나중에 표준 C 컴파일러를 사용하면 인라인 함수와 호환되도록 동의하십시오. 또한 do-while advice는 구식입니다. 모든 최신 C 코딩 표준은 버그 수를 대폭 줄이기 위해 각 명령문 다음에 {}를 적용합니다. 따라서 코딩 규칙이 있다면 do-while은 불필요합니다. – Lundin

+0

@ Lundin : 난 빌어 먹을거야. 나는 가슴 앓이를 일으켰을 것이지만 gcc는 위태로운 상태 일지라도 괜찮을 것이다. 그리고'()'를 지키려는 이유를 받아 들일 것입니다. 나는 상징 상수를 초월한 무언가를 위해 매크로를 쓰는 경향이있다. –

관련 문제