ПрограммированиеФорумОбщее

C++ ifdef / ifndef

Страницы: 1 2 3 4 Следующая »
#0
19:22, 19 окт 2010

Существует ли в С++ аналог #ifdef / #ifndef, который позволил бы определить объявлен ли некоторый тип данных?
Что-то вроде:

ifndef uint
typedef unsigned int uint;
endif
#1
19:23, 19 окт 2010

нет

#2
19:24, 19 окт 2010

печально

#3
19:26, 19 окт 2010

ВНЕЗАПНО РЕШЕНИЕ

#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;
#4
19:30, 19 окт 2010

kvakvs
Да что ты :)
Каким образом эта писанина решает мою проблему?

#5
19:33, 19 окт 2010

Trinimac
> Каким образом эта писанина решает мою проблему?
Описанная в первом посте проблема решается прекрасно моим способом.
Типов не было, и объявились.
На платформах, где они уже были, я просто включаю нужный заголовок.

В остальном такая проблема возникать не должна. Если нужен тип - инклюдишь нужный заголовок. От циклического инклюда пишем "#ifdef header guard" или #pragma once.

#6
19:38, 19 окт 2010

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

...
#7
19:41, 19 окт 2010
#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

А зачем сложнее? Часто новые осы появляются?

#8
19:43, 19 окт 2010

> Ты предлагаешь банально сделать так?
Он предлагает сделать то, что делают практически в любом C-проекте, который больше, чем на один файл...

#9
20:53, 19 окт 2010

странная какая-то проблема ... где это может понадобиться ? что мешает объявить все типы? если они не будут использоваться, то компилятор их проигнорирует.

#10
21:44, 19 окт 2010

KKH
не поверишь но иногда бывают конфликты, когда ты пытаешься определить тип, который уже объявлен
например у меня есть тип bitset и он объявлен как typedef unsigned int bitset
А вот что если я подключу какую-то стороннюю либу в которой будет typedef unsigned long bitset?

#11
21:47, 19 окт 2010

Trinimac
> А вот что если я подключу какую-то стороннюю либу в которой будет typedef unsigned long bitset?
namespace SomeName
{
#include "Сторонний.h"
}

#12
21:57, 19 окт 2010

ashujon
хм, ща попробую :)

#13
22:03, 19 окт 2010

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
#14
22:21, 19 окт 2010

ashujon
> namespace SomeName
> {
> #include "Сторонний.h"
> }
не будет работать, будет ошибка линковки...

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.