我試了一個多星期沒有成功。將枚舉轉換爲枚舉的MACRO
我在兩個處理器之間創建一個記錄器接口,我需要幫助定義自動化的MACROS。
我的意思是? 假設我有一個記錄器消息定義爲LOGGER_MSG_ID_2
,它採用uint8和uint16類型的兩個參數。
我有一個枚舉定義爲:
typedef enum{
PARAM_NONE,
PARAM_SIZE_UINT8,
PARAM_SIZE_UINT16,
PARAM_SIZE_UINT32
}paramSize_e;
所以LOGGER_MSG_ID_2
將具有位圖定義爲:
#define LOGGER_MSG_ID_2_BITMAP (PARAM_SIZE_UINT16 << 2 | PARAM_SIZE_UINT8)
此位圖是1點字節的大小,所以參數的最大數目是4。 稍後,我有一個根據消息ID定義所有參數類型的列表:
#define ID_2_P0_TYPE uint8 // first parameter
#define ID_2_P1_TYPE uint16 // 2nd parameter
#define ID_2_P2_TYPE 0 // 3rd parameter
#define ID_2_P3_TYPE 0 // 4th parameter
正如我所說,我有4個參數的限制,所以我想定義它們,讓MACRO決定使用它們的天氣。我將它們定義爲0,但它可以是任何有效的。
我有其他的MACROS使用位圖來獲取所有類型的屬性,如參數數量和消息大小。
現在這是棘手的部分。我想建立一個MACRO,根據類型創建一個位圖。原因是我不想在位圖和參數定義之間進行冗餘。 我的問題是,我試過的一切都無法編譯。
最後,我想有一個宏,如:
#define GET_ENUM_FROM_TYPE(_type)
,讓我PARAM_SIZE_UINT8,PARAM_SIZE_UINT16或PARAM_SIZE_UINT32根據類型。
限制:我在Windows(armcl.exe)和C99上使用arm編譯器。我不能使用C11 Generic()
。
我試過如下:
#define GET_ENUM_FROM_TYPE(_type) \
(_type == uint8) ? PARAM_SIZE_UINT8 : \
((_type == uint16) ? PARAM_SIZE_UINT16 : \
((_type == uint32) ? PARAM_SIZE_UINT32 : PARAM_NONE))
最後,我想用它喜歡:
#define LOGGER_MSG_ID_2_BITMAP \
(GET_ENUM_FROM_TYPE(ID_2_P3_TYPE) << 6 | \
GET_ENUM_FROM_TYPE(ID_2_P2_TYPE) << 4 | \
GET_ENUM_FROM_TYPE(ID_2_P1_TYPE) << 2 | \
GET_ENUM_FROM_TYPE(ID_2_P0_TYPE))
但是,當我使用它,它不會編譯。
我有位圖的表:
uint8 paramsSizeBitmap [] = {
LOGGER_MSG_ID_1_BITMAP, /* LOGGER_MSG_ID_1 */
LOGGER_MSG_ID_2_BITMAP, /* LOGGER_MSG_ID_2 */
LOGGER_MSG_ID_3_BITMAP, /* LOGGER_MSG_ID_3 */
LOGGER_MSG_ID_4_BITMAP, /* LOGGER_MSG_ID_4 */
LOGGER_MSG_ID_5_BITMAP, /* LOGGER_MSG_ID_5 */
LOGGER_MSG_ID_6_BITMAP, /* LOGGER_MSG_ID_6 */
LOGGER_MSG_ID_7_BITMAP, /* LOGGER_MSG_ID_7 */
LOGGER_MSG_ID_8_BITMAP, /* LOGGER_MSG_ID_8 */
LOGGER_MSG_ID_9_BITMAP, /* LOGGER_MSG_ID_9 */
LOGGER_MSG_ID_10_BITMAP, /* LOGGER_MSG_ID_10 */
};
而且我得到這個錯誤:
line 39: error #18: expected a ")"
line 39: error #29: expected an expression
(線39 LOGGER_MSG_ID_2_BITMAP
)
我在哪裏去了?
----- -----編輯
現在我有一個解決辦法,我真的不喜歡。 我不使用UINT64,所以我做了一個使用sizeof()
MACRO的,現在我的MACRO看起來是這樣的:
#define GET_ENUM_FROM_TYPE(_type) \
(sizeof(_type) == sizeof(uint8)) ? PARAM_SIZE_UINT8 : \
((sizeof(_type) == sizeof(uint16)) ? PARAM_SIZE_UINT16 : \
((sizeof(_type) == sizeof(uint32)) ? PARAM_SIZE_UINT32 : PARAM_NONE))
和我paraemters名單是:
#define NO_PARAM uint64
#define ID_2_P0_TYPE uint8
#define ID_2_P1_TYPE uint16
#define ID_2_P2_TYPE NO_PARAM
#define ID_2_P3_TYPE NO_PARAM
它工作正常,但...你知道...
您是否在預處理後檢查了表的外觀?大多數編譯器都提供了輸出預處理源文件的選項。 – user694733
另外,像'GET_ENUM_FROM_TYPE'這樣的不重要的宏應該被包裝在圓括號中。運營商的優先權可能會在這裏咬你。 – user694733
「這個位圖是1個字節大小」那麼你爲什麼使用uint16?沒有多大意義。 – Lundin