1

Итак, у меня есть некоторые обработчики обработки звука, и мне было интересно, как я могу определить точность процессора. Я знаю, что Visual Studio определяет некоторые макросы процессора, но я не могу найти их полный список. Я бы предпочел, чтобы это была проверка времени компиляции, потому что я, вероятно, собираюсь скомпилировать это для разных процессоров.Visual Studio Определение Endianness

EDIT: Также я ориентирую окна. Я слышал, что Windows использует только Little Endian, это правда?

ответ

1

Visual Studio предоставляет только макросы препроцессора, идентифицирующие платформу (например, _WIN32 и т. Д.). Полный список можно найти здесь: https://msdn.microsoft.com/en-us/library/b0084kay.aspx. К сожалению, он не дает никаких признаков идентификации. Из целевых макросов платформы в этом списке вы должны определить, является ли эта платформа большой или маленькой. Как указывалось в ответе на этот вопрос (Can I safely assume that Windows installations will always be little-endian?), Windows x86/x64 всегда мало ориентирована.

Однако нет никакой гарантии, что будущие обновления Windows не будут нацелены на процессоры большого числа, но в этом случае этот список, скорее всего, будет обновлен. Также обратите внимание, что Visual Studio с разными компиляторами в настоящее время нацелена на не-Windows-платформы, которые являются большими endian (например, Xbox 360).

3

Я нашел способ определить континент с использованием препроцессора C.

Пожалуйста, обратите внимание, что я не проверял этот код на большой Endian машине

Он использует некоторые предопределенные из типов значений реестра [1].

REG_DWORD определяется там как континент архитектуры Windows.

Добавить функции _byteswap_TYPE в микс, и мы можем написать определение препроцессора [2].

#include <Windows.h> 

#if REG_DWORD == REG_DWORD_LITTLE_ENDIAN 
# define le_to_host_ulong(VAL) VAL 
# define be_to_host_ulong(VAL) _byteswap_ulong(VAL) 
# define le_to_host_ushort(VAL) VAL 
# define be_to_host_ushort(VAL) _byteswap_ushort(VAL) 
# define le_to_host_uint64(VAL) VAL 
# define be_to_host_uint64(VAL) _byteswap_uint64(VAL) 
#else 
# define le_to_host_ulong(VAL) _byteswap_ulong(VAL) 
# define be_to_host_ulong(VAL) VAL 
# define le_to_host_ushort(VAL) _byteswap_ushort(VAL) 
# define be_to_host_ushort(VAL) VAL 
# define le_to_host_uint64(VAL) _byteswap_uint64(VAL) 
# define be_to_host_uint64(VAL) VAL 
#endif 

[1] https://msdn.microsoft.com/en-us/library/windows/desktop/ms724884(v=vs.85).aspx

[2] https://msdn.microsoft.com/en-us/library/a3140177.aspx