将 INT32BE 宏转换为 constexpr 是否正确?
Is this conversion of an INT32BE macro to a constexpr correct?
我有以下宏,想将其转换为 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 位整数吗?
我不能从 'language-lawyer' 的角度说话,但是您给出的 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
)。
我有以下宏,想将其转换为 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 位整数吗?
我不能从 'language-lawyer' 的角度说话,但是您给出的 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
)。