2014-01-09 183 views
0

我有一段代碼如下C代碼預處理器

Local_DATA[0] = * ((int32_T *) event_structure + 1); 
    Local_DATA[1] = * ((int32_T *) event_structure + 2); 
    Local_DATA[2] = * ((int32_T *) event_structure + 3); 
    Local_DATA[3] = * ((int32_T *) event_structure + 4); 

我將不得不作出預處理器等

#ifdef ABC 
      Local_DATA[0] = * ((int32_T *) event_structure + 1); 
      Local_DATA[1] = * ((int32_T *) event_structure + 2); 
      Local_DATA[2] = * ((int32_T *) event_structure + 3); 
      Local_DATA[3] = * ((int32_T *) event_structure + 4); 
    #else 
      Local_DATA[0] = ntohl (* ((int32_T *) event_structure + 1)); 
      Local_DATA[1] = ntohl (* ((int32_T *) event_structure + 2)); 
      Local_DATA[2] = ntohl (* ((int32_T *) event_structure + 3)); 
      Local_DATA[3] = ntohl (* ((int32_T *) event_structure + 4)); 
    #endif 

我有許多行代碼,其中我必須手動執行此。有什麼辦法可以像定義宏一樣?

+0

確保數據總是*網絡字節順序可能會更容易,那麼您不需要預處理器條件。 –

+0

你能告訴我們每個組的相似和不同部分是什麼?如果不知道哪些部分是恆定的,哪些部分是可變的,我們就不能顯示最佳宏。 – Barmar

+0

ntohl是一個宏,int32_T是一個數據類型,event_structure和Local_Data是變量。 – Matt

回答

1

當然,只是用一個函數式宏:

#if ABC 
#define MYORDER(x) (x) 
#else 
#define MYORDER(x) ntohl(x) 
#endif 
... 

Local_DATA[0] = MYORDER(* ((int32_T *) event_structure + 1)); 
Local_DATA[1] = MYORDER(* ((int32_T *) event_structure + 2)); 
Local_DATA[2] = MYORDER(* ((int32_T *) event_structure + 3)); 
Local_DATA[3] = MYORDER(* ((int32_T *) event_structure + 4)); 
2

你只需要做到這一點:

Local_DATA[0] = ntohl (* ((int32_T *) event_structure + 1)); 
    Local_DATA[1] = ntohl (* ((int32_T *) event_structure + 2)); 
    Local_DATA[2] = ntohl (* ((int32_T *) event_structure + 3)); 
    Local_DATA[3] = ntohl (* ((int32_T *) event_structure + 4)); 

,如同網絡順序是一樣的主機順序ntohl會一個宏是一個noop。 否則ntohl將做必要的操作

2
#ifdef ABC 
    #define REF_PTR(s, off) (* ((int32_T *) s + off)) 
#else 
    #define REF_PTR(s, off) (ntohl (* ((int32_T *) s + off))) 
#endif 

Local_DATA[0] = REF_PTR(event_structure, 1); 
// etc 

應該做的伎倆。

+0

在所有建議的方式中,我將不得不更改代碼 Local_DATA [0] = *((int32_T *)event_structure + 1); Local_DATA [1] = *((int32_T *)event_structure + 2); Local_DATA [2] = *((int32_T *)event_structure + 3); Local_DATA [3] = *((int32_T *)event_structure + 4); 對我來說,我有代碼中存在的上述行,有沒有辦法保留上面的行,並定義宏? – Matt

+0

坦白地說,沒有!你不能根據定義改變這些行,而不需要以某種方式調用宏來處理它。 –

0
#include <boost/preprocessor/repetition/repeat.hpp> 
#include <boost/preprocessor/arithmetic/add.hpp> 

#ifdef ABC 
    #define PROC1(z, n, func) Local_DATA[n] = * ((int32_T *) event_structure + BOOST_PP_ADD(n, 1)); 
#else 
    #define PROC1(z, n, func) Local_DATA[n] = func (* ((int32_T *) event_structure + BOOST_PP_ADD(n, 1))); 
#endif 
#define PROC(func, n) BOOST_PP_REPEAT(n, PROC1, func) 

... 

PROC(ntohl, 4);