Добрый день!
Я конечно понимаю, что в С (не С++) эти и подобные типы находятся в <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 использовать.
Если ли маленький и универсальный велосипед для этого?
С грустью подозреваю что нету...
Здравствуйте, GhostCoders, Вы писали:
GC>Но, как я понимаю, что не все С компиляторы поддерживают подобные типы.
...
GC>uint8_t это всегда unsigned char.
Ну да
конечно
GC>но для этого нужно включить какой-нибудь config.h, или требовать от пользователя определения HAVE_STDINT_H, если его компилятор поддерживает это.
Не заморачивайтесь. Просто объявите свои типы, но в одном месте. Как например в
Opengl. Кому надо исправит под свой компилятор.
Здравствуйте, GhostCoders, Вы писали:
GC>
GC>Если ли маленький и универсальный велосипед для этого?
GC>С грустью подозреваю что нету...
По умолчанию предоставь алиасы всех нужных типов сам, но дай пользователю возможноть конфигурировать это или вообще отключить:
// generator_obvertok_types.h
#ifndef GHOST_CODERS_DO_NOT_DEFINE_INTEGRAL_TYPES
#ifdef HAVE_STDINT_H
#include <stdint.h>
#else
typedef ... int8_t;
typedef ... int16_t;
typedef ... int32_t;
typedef ... int64_t;
typedef ... uint8_t;
typedef ... uint16_t;
typedef ... uint32_t;
typedef ... uint64_t;
#endif
#endif // GHOST_CODERS_DO_NOT_DEFINE_INTEGRAL_TYPES
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, GhostCoders, Вы писали:
GC>>
GC>>Если ли маленький и универсальный велосипед для этого?
GC>>С грустью подозреваю что нету...
R>По умолчанию предоставь алиасы всех нужных типов сам, но дай пользователю возможноть конфигурировать это или вообще отключить:
R>R>// generator_obvertok_types.h
R>#ifndef GHOST_CODERS_DO_NOT_DEFINE_INTEGRAL_TYPES
R>#ifdef HAVE_STDINT_H
R>#include <stdint.h>
R>#else
R>typedef ... int8_t;
R>typedef ... int16_t;
R>typedef ... int32_t;
R>typedef ... int64_t;
R>typedef ... uint8_t;
R>typedef ... uint16_t;
R>typedef ... uint32_t;
R>typedef ... uint64_t;
R>#endif
R>#endif // GHOST_CODERS_DO_NOT_DEFINE_INTEGRAL_TYPES
R>
так а разве это не обман?
вообще, сама постановка какая-то странная — если в проге используются типы с явно указанной разрядностью, значит, нужна именно такая разрядность (ни больше, ни меньше). и если компилятор не поддерживает соответствующий тип, то данная программа и не должна компилироваться.
другое дело, когда это, какие-нибудь *_least типы.
Здравствуйте, GhostCoders, Вы писали:
GC>Например, Microsoft Visual Studio версий 2008 и более ранних.
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef __int64 int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;