Sau khi một số tìm kiếm một cách để kiểm tra endianess tại thời gian biên dịch tôi đã đi lên với các giải pháp sau đây:Thử nghiệm endianess tại thời gian biên dịch: là hàm constexpr này đúng theo tiêu chuẩn?
static const int a{1};
constexpr bool is_big_endian()
{
return *((char*)&(a)) == 1;
}
GCC chấp nhận mã này chỉ có ở một số bối cảnh nơi constexpr được yêu cầu:
int b[is_big_endian() ? 12 : 25]; //works
std::array<int, testendian() ? 12 : 25> c; //fails
Đối với trường hợp thứ hai, GCC cho biết error: accessing value of ‘a’ through a ‘char’ glvalue in a constant expression
. Tôi không thể tìm thấy bất cứ điều gì trong tiêu chuẩn cấm điều đó. Có lẽ ai đó có thể làm rõ trong trường hợp nào GCC là chính xác?
Hãy thử biên dịch đầu tiên với cảnh báo trên (gợi ý: đó là VLA). –
Vâng, C++ 11 không có mảng độ dài thay đổi theo như tôi nhớ. Mặc dù vậy, đó là một lỗi khác, vì tôi không nhận được cảnh báo nào với -Wall. BTW, tôi sử dụng GCC-4.7 – p12
Tôi bằng cách nào đó nghi ngờ điều này là có thể, ở cấp độ cơ bản: Endianness là tài sản của việc triển khai *, nhưng phép thuật biên dịch diễn ra hoàn toàn như kết quả của việc áp dụng các quy tắc của * ngôn ngữ *. Đặc biệt, lấy địa chỉ của một đối tượng dường như không phải là một khái niệm biên dịch-thời gian. –