Лисапед для int32_t и прочих (язык С)
От: GhostCoders Россия  
Дата: 07.02.17 17:30
Оценка:
Добрый день!

Я конечно понимаю, что в С (не С++) эти и подобные типы находятся в <stdint.h>.
Но, как я понимаю, что не все С компиляторы поддерживают подобные типы.
Например, Microsoft Visual Studio версий 2008 и более ранних.
Для студий есть компонент msinttypes от Alexander Chemeris (https://code.google.com/archive/p/msinttypes/).

Но для той системы генерации, что у меня в подписи требуется для как можно большего числа С компиляторов (включая и довольно старые и экзотические) иметь поддержку хотя бы этих типов:
int8_t
int16_t
int32_t
int64_t (необязательно, но хотелось бы)
uint8_t
uint16_t
uint32_t
uint64_t (необязательно, но хотелось бы)


Как я понимаю, int8_t это всегда signed char на всех компиляторах,
uint8_t это всегда unsigned char.

А вот с остальными проблема.
Можно, конечно положиться на stdint.h,
но перед тем, как его включать, нужно убедиться, что он есть в системе:
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif


но для этого нужно включить какой-нибудь config.h, или требовать от пользователя определения HAVE_STDINT_H, если его компилятор поддерживает это.

Тянуть за собой msinttypes специально для MSVC — не хочется, а что будет если какой-нибудь старый Borland компилятор?

Можно, конечно, вообще ничего не включать, и не объявлять, а оставить это на откуп пользователю библиотеки:
включать ли ему #include <stdint.h> (или там <cstdint.h> в С++11 или из буста что-либо)
перед включением хидеров библиотеки, или самому делать через typedef, или же msinttypes использовать.

Если ли маленький и универсальный велосипед для этого?
С грустью подозреваю что нету...
Третий Рим должен пасть!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.