Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> g++ не принимает конструкцию вида #if MACROS, вылетаем по ошибке: оператор «*» не имее 
:(
    Опции темы
trupca
Дата 1.10.2013, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



использую такой код для определения порядка байтов на платформе под которой компилируется код (взял отседова).

Код

#define CURRENT_BYTE_ORDER       (*(int *)"\x01\x02\x03\x04")
#define LITTLE_ENDIAN_BYTE_ORDER 0x04030201
#define BIG_ENDIAN_BYTE_ORDER    0x01020304

#define IS_LITTLE_ENDIAN (CURRENT_BYTE_ORDER == LITTLE_ENDIAN_BYTE_ORDER)
#define IS_BIG_ENDIAN    (CURRENT_BYTE_ORDER == BIG_ENDIAN_BYTE_ORDER)


к этому хочется добавить ещё и такую проверку:
Код

#if (IS_LITTLE_ENDIAN == 0) && (IS_BIG_ENDIAN == 0)
#error NOT SUPPORTED ENDIAN
#endif


но g++ говорит - "нельзя" - и показыват фигу ошибку:
Код

tmp.cpp:25:6: ошибка: оператор «*» не имеет левого операнда


видим он прав, но я не понимаю почему нельзя сделать вот например так:
Код

#if IS_BIG_ENDIAN
cout << "hello world" << endl;
#endif


когда можно написать так:
Код

#if 1
cout << "hello world" << endl;
#endif


как тогда договриться с компилятором что бы он понял, что нельзя компилировать код, когда ни одна из этих переменных не установлена в истину?
PM MAIL   Вверх
feodorv
Дата 1.10.2013, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(trupca @  1.10.2013,  19:51 Найти цитируемый пост)
взял отседова

Ну там совсем другое дело, без дефайнов.


Цитата(trupca @  1.10.2013,  19:51 Найти цитируемый пост)
но я не понимаю почему нельзя сделать вот например так

Препроцессор таких наворотов не понимает. Самый грамотный путь, КМК, сгенерировать внешний хедер-файл самописной программой в Вашем стиле:
Код
unsigned int v = *(unsigned int *) "\x01\x02\x03\x04";
printf( "#ifndef MY_HEADER_H\n" );
printf( "#define IS_LITTLE_ENDIAN %d\n", (v == 0x04030201u) ? 1 : 0);
printf( "#define IS_BIG_ENDIAN %d\n", (v == 0x01020304u) ? 1 : 0);
printf( "#endif\n" );

и уже его включать в Ваш код по анализу порядка следования байт. Проблемы могут быть с 64-битной платформой, а также всегда нужно будет следить при переносе кода на другую платформу, чтобы этот .h-файл был вытерт.


Вообще же, есть полезный инструмент autoconf, которым и стоит воспользоваться, на мой взгляд...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
trupca
Дата 1.10.2013, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



жаль, но то что вы предлагаете я использовать не могу - единственный возможный для меня вариант использовать препоцессор и вот по каким соображениям:
сами по себе танцы с препроцессором нужны для условной компиляции. это уже нужно для сериализация данных после обработки на big endian для последующей их обработки на le. причём есть условие: нельзя что бы из-за сериализации на big endian страдал код на litlle endian, а разделять код на две ветки нельзя, так как это может повлечь за собой трудно уловимые ошибки и снизить мобильность кода.
PM MAIL   Вверх
xvr
Дата 2.10.2013, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(trupca @  1.10.2013,  20:59 Найти цитируемый пост)
единственный возможный для меня вариант использовать препоцессор 

Это невозможно. Препроцессор не исполняет никакого кода, и он никак не связан с платформой, на которой работает. Он занимается исключительно обработкой текста программы. Никакие обращения из него к реалиям аппаратной платформы невозможны по определению  smile 

PM MAIL   Вверх
trupca
Дата 2.10.2013, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



увы, да. и "хитрого" способа заставить то, что я хотел заставить работать, не существует. я не нашёл по крайней мере. мб кому то больше улыбнётся удача.
как я понял, просомтрев все доступные мне реализации определения текущей платформы с помощью препроцессора, существует лишь один способ её определения - просмотреть определены ли все известные дефайны всех известных (нужных) программисту компиляторов, сред и ОС на наличие дефайна по которому можно сделать вывод о том какая последовательность байт применяется на платформе. как, например, это сделано в бусте:
Код

#elif defined(__i386__) || defined(__alpha__) \
   || defined(__ia64) || defined(__ia64__) \
   || defined(_M_IX86) || defined(_M_IA64) \
   || defined(_M_ALPHA) || defined(__amd64) \
   || defined(__amd64__) || defined(_M_AMD64) \
   || defined(__x86_64) || defined(__x86_64__) \
   || defined(_M_X64) || defined(__bfin__)

# define BOOST_LITTLE_ENDIAN
# define BOOST_BYTE_ORDER 1234
#else
# error The file boost/detail/endian.hpp needs to be set up for your CPU type.

который я и использовал. хорошо что он уже написан о_0
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.