2013-07-11 1 views
1

인수를 사용하지 않지만 미리 정의 된 정수와 사용되는 문자열이있는 매크로를 만들고 싶습니다. 문자열 연결을 사용하는 매크로

나는 인수가 매크로와 비슷한에 대해 뭔가하기 전에 물어 보는 이는 그것이 얼마나입니다 :

#define BUZZER_PIN 1 
#define BUZZER_PORT B 
#define BUZZER_ALT 1 

#define INIT_BUZZER_(PORTX, PIN, ALT)         \ 
    do {                \ 
     PORT##PORTX##_PCR(PIN) = PORT_PCR_MUX(ALT) | PORT_PCR_DSE_MASK; \ 
     GPIO##PORTX##_PDDR |= (PIN)<<1;         \ 
     } while (0) 

#define INIT_BUZZER(PORTX, PIN, ALT)         \ 
    INIT_BUZZER_(PORTX, PIN, ALT) 

하지만 난 그냥 INIT_BUZZER_ 참조 될 INIT_BUZZER을 갖고 싶어하고 무엇보다도 않으면? 난 항상에만 문자열로 문제가 있습니다 내가 아니라 그 부분을 이해하지 못하는

#define INIT_BUZZER INIT_BUZZER_(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT) 

:

나는에 노력했다. 내가하지 그것의 값이 B

+0

stringify 지시어는 어떻습니까? '# BUZZER'는 큰 따옴표로 묶인 BUZZER 매크로의 값을 대체합니다. –

+0

동일한 이름을 가진 두 개의 매크로를 사용할 수 없습니다. – jxh

+0

'INIT_BUZZER' 두 버전을 동시에 정의하려고하지 않습니다. 그렇습니까? – user2357112

답변

2

당신은이 INIT_BUZZER_에 전달되기 전에 매크로 인수를 확장하는 다른 매크로가 필요 = 나는 문자열 BUZZER_PORT로 처리 BUZZER_PORT 얻을이 방법을 호출하는 경우. 코드에서 INIT_BUZZER를 사용할 때 이제

#define INIT_BUZZER_X(PORTX, PIN, ALT)         \ 
    INIT_BUZZER_(PORTX, PIN, ALT) 

#define INIT_BUZZER INIT_BUZZER_X(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT) 

, 먼저 세 개의 인수 INIT_BUZZER_X로 확장됩니다. 그러면 전 처리기가 INIT_BUZZER_X 프로세스로 진행하여 세 개의 인수를 각각 확장하여 INIT_BUZZER_에 전달합니다.

+0

고맙습니다. 하지만이 매크로는 정말 어려워 보입니다. – user2566355

관련 문제