2016-07-04 61 views
2

我有一堆標記舵機,每個都有自己校準的最小,中等和最大脈寬值。C++宏參數w /令牌串聯?

// 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 

預處理器將對可變宏執行擴展(文本替換),直到它不能再擴展爲止。因此,在經過JOINT_0,如GET_MAX(JOINT_0)將擴大到

GET_MAX2(0x02) 

這被進一步擴大到

SERVO_0x02_MAX 

最後替換爲#define值550

+0

哇!謝謝 - 請您爲此添加一個簡短的解釋爲什麼這有效? –