2014-03-04 4 views
1

제어 할 IO가 여러 개인 stm32f4 칩에서 C++ 응용 프로그램을 프로그래밍하고 있습니다. 동료 중 한 명은 코드를보다 읽기 쉽게하기 위해 모든 IO에 대해 전 처리기 문을 사용하도록 제안했습니다. 예를 들어전 처리기 문에서 C 함수 사용

:

#define FAN_ON  GPIO_SetBits(GPIOD, GPIO_Pin_0); 
#define FAN_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_0); 

이 확인이 방법이며, 그렇지 않은 경우 그 이유는 무엇입니까? 아직 많은 마이크로 컨트롤러 경험이 없지만 프리 프로세서 문에서 세미콜론을 사용해서는 안되며 프리 컴파일러 문에서 함수를 사용하는 것이 좋은지 잘 모르겠습니다.

도움 주셔서 감사합니다.

+1

마이크로 컨트롤러 프로그래밍에 관한 것이 아니라 기본 'C'에 관한 것입니다. [C에서 #define 지시문을보십시오] (http://msdn.microsoft.com/en-us/library/teas0593.aspx) –

+0

IMO, 이것의 아래쪽면은 훨씬 적게 만듭니다. 읽을 수있는 코드. – DiBosco

답변

5

이론에서는 문제가 없지만 세미콜론을 피해야한다는 것이 맞습니다.

그것은 더미 루프의 코드를 포장하는 것이 가장 좋습니다 :

#define FAN_ON do { GPIO_SetBits(GPIOD, GPIO_Pin_0); } while(false) 

이 하나의 문 같은 매크로없이 행동한다.

+0

이제 매크로는 가장 좋아하는 이터레이터의 들여 쓰기를 중단하지 않습니다! – pmr

1

첫 번째 질문에 답하기 위해 이것이 일반적이긴하지만 실제로 전처리 기가 필요할 때를 제외하고는 전 처리기 명령문을 사용하여 함수를 정의하는 것은 좋지 않은 스타일입니다. __LINE__ 같은 것들이 필요할 때 전처리 기가 필요하거나, 함수 이름을 char * 변수에 넣는 것과 같은 선처리 대체 트릭이 필요합니다. 이 매크로 대신에 void fan_on(void)void fan_off(void) 함수를 정의 할 수 있습니다. 매크로로 할 때와 같이 헤더에 선언하려면 static inline을 선언 할 수도 있습니다. 함수는 매크로보다 디버거에서 더 잘 사용할 수 있으며 디버깅이 더 좋습니다.

매크로를 계속 사용하려는 경우 한 줄의 if 블록이 매크로의 첫 번째 줄만 실행하는 경우 매크로를 사용하지 않는 경우 세미콜론을 사용하지 말고 do while(0) 구조를 사용해야합니다 .

+0

감사합니다. 인라인 함수로 처리 할 것입니다. 내가 모르는 유일한 사실은 정적이다. 함수가 클래스 메소드보다 정적이라면 분명하지만 'fan_off'가 일반 C 함수이면 '정적 인라인'이 아닌 '인라인'으로 선언해야한다고 생각하겠습니까? – user3379420

+0

이 상황에서 static은 extern의 반대이며 C++ 클래스와 관련이 없으므로 함수에 내부 링크가 있음을 의미합니다 (즉, 함수가 포함 된 c 파일에서만 표시됨). 함수를 정적으로 선언하지 않으면, 외부 링키지 (전체 프로그램에서 볼 수있는) 함수를 사용하는 c 파일만큼 많은 함수 정의를 가지게 될 것이고 링커는 여러 정의에 대해 불평 할 것입니다. –