Как определить тип, который может содержать uintptr_t или uint32_t без объединения? - PullRequest
2 голосов
/ 12 октября 2019

Как я могу определить тип uintptr так, чтобы он мог содержать по крайней мере uint32_t и uintptr_t, не прибегая к объединению?

Были ли разрешены sizeof() в препроцессоре,это дало бы то, что я хочу:

#include <inttypes.h>
#if sizeof(uint32_t) > sizeof(uintptr_t)  // unlikely, but the standard allows it
    typedef uint32_t uintptr;  
#else
    typedef uintptr_t uintptr;
#endif

Весьма вероятно, что uint32_t будет меньше, если не равно uintptr_t, но стандарт не дает никаких гарантий. Тем не менее, такая платформа была бы очень редкой, поэтому сейчас я решил это, просто имея следующее:

static_assert(sizeof(uint32_t) <= sizeof(uintptr_t), "Yikes");
typedef uintptr_t uintptr;

1 Ответ

5 голосов
/ 12 октября 2019

Нет необходимости, чтобы препроцессор получал такой псевдоним. Это простой пример использования типовых черт стандартной библиотеки

using uintptr = std::conditional_t<(sizeof(uint32_t) > sizeof(uintptr_t)),
                                   uint32_t, uintptr_t>;
...