Po jakimś poszukiwaniu sposobu, aby sprawdzić kolejność bajtów w czasie kompilacji Mam wymyślić następujące rozwiązanie:Testowanie endianess podczas kompilacji: czy ta funkcja constexpr jest poprawna zgodnie ze standardem?
static const int a{1};
constexpr bool is_big_endian()
{
return *((char*)&(a)) == 1;
}
GCC akceptuje ten kod tylko w niektórych sytuacjach, w których wymagana jest constexpr:
int b[is_big_endian() ? 12 : 25]; //works
std::array<int, testendian() ? 12 : 25> c; //fails
W drugim przypadku GCC mówi: error: accessing value of ‘a’ through a ‘char’ glvalue in a constant expression
. Nie mogłem znaleźć niczego w standardzie, który zabrania czegoś takiego. Może ktoś mógłby wyjaśnić, w którym przypadku GCC jest poprawne?
Spróbuj skompilować pierwszą z ostrzeżeniami na (wskazówka: jest to VLA). –
Cóż, C++ 11 nie ma tablic o zmiennej długości, o ile pamiętam. Chociaż, to jest inny błąd, ponieważ nie otrzymuję ostrzeżeń za pomocą -Wall. BTW, używam GCC-4.7 – p12
Wątpię, czy jest to możliwe na podstawowym poziomie: Endianness jest właściwością * realizacji *, ale magia kompilacji dzieje się wyłącznie w wyniku stosowania reguł * języka *. W szczególności przyjęcie adresu obiektu nie wydaje się być pojęciem kompilacji. –