Nó có một số vấn đề:
uint32_t
không đảm bảo tồn tại
"ABCD"
, một mảng phân rã thành một char*
(C) / char const*
(C ++), không được đảm bảo để được căn chỉnh phù hợp cho uint32_t*
. Nếu không, dàn diễn viên là UB
- nếu dàn diễn viên đi qua, deref (
*(uint32_t*)"ABCD"
) là vi phạm bí danh nghiêm ngặt (UB)
Thay vào đó, bạn có thể muốn làm một cái gì đó như thế này:
#if !__cplusplus
#define LITTLE_ENDIAN_EH() (*(char*)&(int){1});
#else
//C++ doesn't have compound literals
static int const LITTLE_ENDIAN_EH_ = 1;
#define LITTLE_ENDIAN_EH() (*(char*)&LITTLE_ENDIAN_EH_)
#endif
(Hoạt động vì char
sẽ tồn tại, có thể bí danh bất cứ điều gì và có yêu cầu căn chỉnh tối thiểu.)
Tất cả các macro, bao gồm cả các nỗ lực của bạn, đều có nhược điểm là không phù hợp với các điều kiện tiền xử lý ( #if ...
) hoặc trong bối cảnh yêu cầu một biểu thức hằng số nguyên ( case
nhãn, kích thước mảng, kích thước bitfield), nhưng khi được sử dụng ở nơi khác, các trình biên dịch hiện đại thường xử lý kết quả là một hằng số thời gian biên dịch liên quan đến đầu ra lắp ráp được tối ưu hóa.