Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Создание типа определенной размерности
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Kryuch Kryuch вне форума
Member
 
Сообщений: 62
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.01.2006
По умолчанию Создание типа определенной размерности - 03.07.2007, 22:44

Есть задача - сделать типы, имеющие на всех платформах определенный размер. Керниган очень не рекомендует в проверке условий использовать sizeof, а плохо представляю, как можно без этого обойтись. Пока это выглядит так
#ifndef sizeof(int)==4
#define DWORD int
........
gcc for linux проглатывает, но выдает warnings.
Как проблему можно решить по человечески?
Ответить с цитированием
  (#2 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
Thumbs down 04.07.2007, 01:08

Ошибка:
Цитата:
#ifndef sizeof(int)==4
Надо так:
Код:
#if sizeof(int)==4
Если на самом деле требуется синхронизировать много составных частей большого проекта с перспективой, то используй метод, уже давно применяемый Microsoft.
Указатели на данной платформе всегда имеют один и тот же размер. Если платформа 32-разрядная, то для всех операционок и всех языков программирования все указатели будут иметь 32-разрядное представление.
Поэтому любые передаваемые далеко данные типизируешь не unsigned long или long, а указателем (любым, хоть void*)
Делаешь reinterpret_cast<unsigned long>(_указатель_) - всегда получишь размерность, соответстующую платформе.
Иначе только на ассемблере. А более надежного и разумного высокоуровневого метода я не знаю.
Ответить с цитированием
  (#3 (permalink)) Старый
Kryuch Kryuch вне форума
Member
 
Сообщений: 62
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.01.2006
По умолчанию 04.07.2007, 03:17

Цитата:
Ошибка:Надо так:
Код:
#if sizeof(int)==4
Как раз #if не работает (как и предупреждал Керниган). По какому принципу в данном случае работае #ifndef не знаю. Как-то работает.
Цитата:
Делаешь reinterpret_cast<unsigned long>(_указатель_) - всегда получишь размерность, соответстующую платформе.
Проблему это не решает. В reinterpret_cast нужно указать конкретный тип (в разных случаях различный)
Ответить с цитированием
  (#4 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 04.07.2007, 07:28

http://www.opengroup.org/onlinepubs/009695...s/stdint.h.html
http://en.wikipedia.org/wiki/Stdint.h
Ответить с цитированием
  (#5 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
По умолчанию 04.07.2007, 16:12

Цитата:
Проблему это не решает. В reinterpret_cast нужно указать конкретный тип (в разных случаях различный)
Насколько мне известно (хотя стандарт я не читал) - размерность long соответствует разрядности платформы, как и указатель - т.е. они всегда имеют одинаковый размер. Но это, признаю, не достоверно.
А stdint - это хорошо.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию 04.07.2007, 16:35

Цитата:
Насколько мне известно (хотя стандарт я не читал) - размерность long соответствует разрядности платформы, как и указатель - т.е. они всегда имеют одинаковый размер.
Нет. Размер указателя и размер long никак не связаны друг с другом и с "разрядностью платформы".
Ответить с цитированием
  (#7 (permalink)) Старый
Arachnelis Arachnelis вне форума
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
Red face 04.07.2007, 18:21

И тем не менее микрофост этот способ активно эксплуатирует. Наверно, они на чем-то основываются?
Ответить с цитированием
  (#8 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию 04.07.2007, 18:41

Майкрософт пишет под Windows (32 и 64) и использует свой компилятор. Почему бы им и не воспользоваться своим положением? Кроссплатформенность им нужна довольно ограниченная.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица размерности Алексей679 Вопросы начинающих программистов 1 16.04.2011 19:09
Создание массивов большой размерности Kidu Visual C++ 13 16.01.2009 18:20
Создание шаблона класса для работы с массивом произвольного типа -R- Вопросы начинающих программистов 1 25.04.2008 23:31
Матрицы большей размерности Mvssjn С/С++ 11 25.12.2007 00:36
Создание временного типа NomberElem toshkaexe Visual C++ 18 21.10.2007 12:50
Нужно в веб редакторе типа WISIWIG организовать создание якорей zornig DHTML, JavaScript, VBScript 2 01.05.2006 19:56
Создание массива строк типа AnsiString Dmt C++ Builder 21 28.07.2005 18:20
Создание переменной типа TChart Turkish .NET 0 28.02.2004 13:17
Создание нового типа компонента на форме Форсаж Delphi 4 24.07.2003 00:58
Создание и заполнение в форме объекта типа DBGrid Anonymous Delphi 12 22.02.2003 01:04
Создание просмотрщика web-страниц типа Explorer Anonymous C++ Builder 4 07.12.2002 00:38
Создание окна открытия папки типа TOpenDialog Anonymous C++ Builder 2 04.12.2002 12:44



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов