Является ли это преобразование макроса INT32BE в constexpr правильным? - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть следующий макрос, и я хотел преобразовать его в constexpr, так как, очевидно, это лучший подход:

#define INT32BE(x) (x[0] << 24 | x[1] << 16 | x[2] << 8 | x[3])

Попытка:

template <typename T>
constexpr auto Int32BE(T array [])
{
    return array[0] << 24 | array[1] << 16 | array[2] << 8 | array[3];
}

Это должно быть используется следующим образом:

const auto address = Int32BE(data.Address);

Определение Address выглядит следующим образом:

UCHAR Address[4];

Это работает, как ожидалось, но я не совсем уверен, как это должно быть записанным.

Вопрос:

Это constexpr для чтения 32-разрядного целого числа из массива, записанного правильно?

1 Ответ

1 голос
/ 08 февраля 2020

Я не могу говорить с точки зрения «юриста-языка», но constexpr, который вы дали, компилируется без предупреждения в следующем коде, с MSVC и clang-cl:

#include <stdio.h>

template <typename T>
constexpr auto Int32BE(T array[]) {
    return array[0] << 24 | array[1] << 16 | array[2] << 8 | array[3];
}

int main() {
    unsigned char Address[4] = { 0x22, 0xAA, 0x11, 0xBB };
    const auto address = Int32BE(Address);
    printf("%08X\n", address);
    return 0;
}

Кроме того, на выходе получается ожидаемое значение (22AA11BB).

...