2014-01-09 4 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); 
Смежные вопросы