![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
trupca |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
использую такой код для определения порядка байтов на платформе под которой компилируется код (взял отседова).
к этому хочется добавить ещё и такую проверку:
но g++ говорит - "нельзя" - и показыват фигу ошибку:
видим он прав, но я не понимаю почему нельзя сделать вот например так:
когда можно написать так:
как тогда договриться с компилятором что бы он понял, что нельзя компилировать код, когда ни одна из этих переменных не установлена в истину? |
||||||||||
|
|||||||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Ну там совсем другое дело, без дефайнов. Препроцессор таких наворотов не понимает. Самый грамотный путь, КМК, сгенерировать внешний хедер-файл самописной программой в Вашем стиле:
и уже его включать в Ваш код по анализу порядка следования байт. Проблемы могут быть с 64-битной платформой, а также всегда нужно будет следить при переносе кода на другую платформу, чтобы этот .h-файл был вытерт. Вообще же, есть полезный инструмент autoconf, которым и стоит воспользоваться, на мой взгляд... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
trupca |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
жаль, но то что вы предлагаете я использовать не могу - единственный возможный для меня вариант использовать препоцессор и вот по каким соображениям:
сами по себе танцы с препроцессором нужны для условной компиляции. это уже нужно для сериализация данных после обработки на big endian для последующей их обработки на le. причём есть условие: нельзя что бы из-за сериализации на big endian страдал код на litlle endian, а разделять код на две ветки нельзя, так как это может повлечь за собой трудно уловимые ошибки и снизить мобильность кода. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это невозможно. Препроцессор не исполняет никакого кода, и он никак не связан с платформой, на которой работает. Он занимается исключительно обработкой текста программы. Никакие обращения из него к реалиям аппаратной платформы невозможны по определению ![]() |
|||
|
||||
trupca |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
увы, да. и "хитрого" способа заставить то, что я хотел заставить работать, не существует. я не нашёл по крайней мере. мб кому то больше улыбнётся удача.
как я понял, просомтрев все доступные мне реализации определения текущей платформы с помощью препроцессора, существует лишь один способ её определения - просмотреть определены ли все известные дефайны всех известных (нужных) программисту компиляторов, сред и ОС на наличие дефайна по которому можно сделать вывод о том какая последовательность байт применяется на платформе. как, например, это сделано в бусте:
который я и использовал. хорошо что он уже написан о_0 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |