2016-07-04 1 views
2

나는 여러개의 라벨이 붙은 서보가 있으며, 각각은 자체적으로 보정 된 최소, 중간 및 최대 펄스 폭 값을 가지고있다.C++ 매크로 인수 (토큰 연결)?

// repository of calibrated servo pulse width values: 

#define SERVO_0x01_MIN 165 
#define SERVO_0x01_MID 347 
#define SERVO_0x01_MAX 550 

#define SERVO_0x02_MIN 165 
#define SERVO_0x02_MID 347 
#define SERVO_0x02_MAX 550 
... 

코드의 유지 관리를 단순화하기 위해 서보를 교체하려면 단일 매크로 정의 값을 변경해야합니다.

// maps certain positions on robot to the servo that is installed there 
#define JOINT_0 0x02 
#define JOINT_1 0x05 
#define JOINT_2 0x0A 
... 

// function-like macros to resolve values from mapping 
#define GET_MIN(servo) SERVO_##servo##_MIN 
#define GET_MID(servo) SERVO_##servo##_MID 
#define GET_MAX(servo) SERVO_##servo##_MAX 

난 데 문제는 그 자체가 단말기 값으로 해결되지 않는 매크로입니다 인수로 함수와 같은 매크로를 호출 : 내가하기 위해 할 수있는 일

// main 
int main(void) { 

    // this works 
    int max_0x01 = GET_MAX(0x01); // int max_0x01 = 550; 

    // this doesn't 
    int max_joint_0 = GET_MAX(JOINT_0); // int max_joint_0 = SERVO_JOINT_0_MAX; 
} 

GET_MAX(JOINT_0)550으로 바뀝니 까?

답변

3
#define GET_MAX(servo) GET_MAX2(servo) 
#define GET_MAX2(servo) SERVO_##servo##_MAX 

전 처리기는 더 이상 확장 할 수 없을 때까지 가변 매크로에서 확장 (텍스트 대체)을 수행합니다. 그래서

GET_MAX2(0x02) 

GET_MAX(JOINT_0) 등이 확장됩니다, JOINT_0 전달이 더 #define 값 550

+0

와우와

SERVO_0x02_MAX 

로 확대 그리고 마지막으로 교체됩니다! 감사합니다 - 왜 이것이 작동하는지 간단한 설명을 추가해 주시겠습니까? –