Существует ли в С++ аналог #ifdef / #ifndef, который позволил бы определить объявлен ли некоторый тип данных?
Что-то вроде:
ifndef uint typedef unsigned int uint; endif
нет
печально
ВНЕЗАПНО РЕШЕНИЕ
#ifdef _WIN32 typedef unsigned __int8 uint8_t; typedef unsigned __int8 byte_t; typedef signed __int8 int8_t; typedef unsigned __int16 uint16_t; typedef signed __int16 int16_t; typedef unsigned __int32 uint32_t; typedef signed __int32 int32_t; typedef unsigned __int64 uint64_t; typedef signed __int64 int64_t; #endif #ifdef MACOSX #include <stdint.h> #endif typedef uint8_t byte_t;
kvakvs
Да что ты :)
Каким образом эта писанина решает мою проблему?
Trinimac
> Каким образом эта писанина решает мою проблему?
Описанная в первом посте проблема решается прекрасно моим способом.
Типов не было, и объявились.
На платформах, где они уже были, я просто включаю нужный заголовок.
В остальном такая проблема возникать не должна. Если нужен тип - инклюдишь нужный заголовок. От циклического инклюда пишем "#ifdef header guard" или #pragma once.
kvakvs
У меня в двиге есть типы uint, sint, ushort, sshort
Ты предлагаешь банально сделать так?
#ifdef _WIN_OS_ typedef signed short sshort; typedef signed int sint; typedef unsigned short ushort; typedef unsigned int uint; #endif #ifdef _LIN_OS_ typedef signed short sshort; typedef signed int sint; typedef unsigned short ushort; typedef unsigned int uint; #endif #ifdef _MAC_OS_ typedef signed short sshort; typedef signed int sint; typedef unsigned short ushort; typedef unsigned int uint; #endif // в этой ОС допустим уже есть тип uint #ifdef _NEW_SUPER_PUPER_OS_ typedef signed short sshort; typedef signed int sint; typedef unsigned short ushort; #endif ...
#ifdef _WIN32 typedef unsigned __int16 ushort; typedef signed __int16 sshort; typedef unsigned __int32 uint; typedef signed __int32 sint; #endif #ifdef MACOSX #include <stdint.h> typedef uint16_t ushort; typedef int16_t sshort; typedef uint32_t uint; typedef int32_t sint; #endif
А зачем сложнее? Часто новые осы появляются?
> Ты предлагаешь банально сделать так?
Он предлагает сделать то, что делают практически в любом C-проекте, который больше, чем на один файл...
странная какая-то проблема ... где это может понадобиться ? что мешает объявить все типы? если они не будут использоваться, то компилятор их проигнорирует.
KKH
не поверишь но иногда бывают конфликты, когда ты пытаешься определить тип, который уже объявлен
например у меня есть тип bitset и он объявлен как typedef unsigned int bitset
А вот что если я подключу какую-то стороннюю либу в которой будет typedef unsigned long bitset?
Trinimac
> А вот что если я подключу какую-то стороннюю либу в которой будет typedef unsigned long bitset?
namespace SomeName
{
#include "Сторонний.h"
}
ashujon
хм, ща попробую :)
Trinimac
> Ты предлагаешь банально сделать так?
Делать так не надо. Делать надо так:
#include <limits.h> #if UCHAR_MAX == 0xff typedef char int8; typedef unsigned char uint8; #else # error "8-bit integral type was not found. Please edit types.h manually." #endif #if USHRT_MAX == 0xffff typedef short int16; typedef unsigned short uint16; #else # error "16-bit integral type was not found. Please edit types.h manually." #endif #if UINT_MAX == 0xffffffff typedef int int32; typedef unsigned int uint32; #elif ULONG_MAX == 0xffffffff typedef long int32; typedef unsigned long uint32; #else # error "32-bit integral type was not found. Please edit types.h manually." #endif #if UINT_MAX == 0xffffffffffffffff typedef int int64; typedef unsigned int uint64; #elif ULONG_MAX == 0xffffffffffffffff typedef long int64; typedef unsigned long uint64; #elif ULLONG_MAX == 0xffffffffffffffff typedef long long int64; typedef unsigned long long uint64; #else # error "64-bit integral type was not found. Please edit types.h manually." #endif
ashujon
> namespace SomeName
> {
> #include "Сторонний.h"
> }
не будет работать, будет ошибка линковки...
Тема в архиве.