Лисапед для 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 использовать.

Если ли маленький и универсальный велосипед для этого?
С грустью подозреваю что нету...
Третий Рим должен пасть!
Re: Лисапед для int32_t и прочих (язык С)
От: kov_serg Россия  
Дата: 07.02.17 19:34
Оценка: 2 (1)
Здравствуйте, GhostCoders, Вы писали:

GC>Но, как я понимаю, что не все С компиляторы поддерживают подобные типы.

...
GC>uint8_t это всегда unsigned char.
Ну да конечно


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

Не заморачивайтесь. Просто объявите свои типы, но в одном месте. Как например в Opengl. Кому надо исправит под свой компилятор.
Re: Лисапед для int32_t и прочих (язык С)
От: rg45 СССР  
Дата: 07.02.17 19:45
Оценка: 2 (1)
Здравствуйте, 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
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: Лисапед для int32_t и прочих (язык С)
От: Alexander G Украина  
Дата: 12.02.17 08:30
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Если ли маленький и универсальный велосипед для этого?


Эти типы опциональны, т.е. может некоторых и не быть.
Необходимы только _fast и _least типы (которые могут быть больше требуемой битности).
Русский военный корабль идёт ко дну!
Re[2]: Лисапед для int32_t и прочих (язык С)
От: _hum_ Беларусь  
Дата: 12.02.17 10:43
Оценка:
Здравствуйте, 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 типы.
Re: Лисапед для int32_t и прочих (язык С)
От: drVanо Россия https://vmpsoft.com
Дата: 12.02.17 14:45
Оценка: 4 (1)
Здравствуйте, 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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.