Если вы удалите {
}
, вы можете просто:
#define MY_ARRAY 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
#define DO_IT_2(_0,_1,_2,_3,_4,_5,_6,_7) (\
(unsigned long long)(_7) << (7 * 8) | \
(unsigned long long)(_6) << (6 * 8) | \
etc... \
(unsigned long long)(_0) << (0 * 8))
#define DO_IT(x) DO_IT_2(x)
обновить:
#define MY_ARRAY2 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
#define REVERSE_LL_8(_0,_1,_2,_3,_4,_5,_6,_7) (\
(unsigned long long)(_7) << (7 * 8) | \
(unsigned long long)(_6) << (6 * 8) | \
etc... \
(unsigned long long)(_0) << (0 * 8))
#define DO_IT_2(_0,_1,_2,_3,_4,_5,_6,_7,...) \
REVERSE_LL_8(_0,_1,_2,_3,_4,_5,_6,_7)
#define DO_IT(x) DO_IT_2(x)
#define DO_TOO_2(a0,a1,a2,a3,a4,a5,a6,a7,_0,_1,_2,_3,_4,_5,_6,_7) \
REVERSE_LL_8(_0,_1,_2,_3,_4,_5,_6,_7)
#define DO_TOO(x) DO_TOO_2(x)
DO_IT(MY_ARRAY2)
DO_TOO(MY_ARRAY2)
, чтобы я мог использовать функции C ++
В C ++ это действительно простая contexpr
функция с initializer_list
:
#include <initializer_list>
#define MY_ARRAY {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}
constexpr unsigned long long DO_IT(const std::initializer_list<int>& l) {
unsigned long long r = 0;
for (auto&& i : l) {
r >>= 8;
r |= (unsigned long long)i << (7 * 8);
}
return r;
}
constexpr long a = DO_IT(MY_ARRAY);