Мечты о кроссплатформенном коде...
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Здравствуйте. Захотелось мне написать программу, которая меняет местами в случайном порядке буквы в слове, кроме первой и последней буквы. Но написать мне захотелось такой код, который бы без проблем компилировался и работал как под
windows
, так и подlinux
.Для осуществления цели был создан макрос:
Который я пытался использовать в таком коде:
Ругается на любое использование
stream
,input
иtemp
.Утверждает, будь то не знает эти имена.
Так же выкрикивал такие неприличные фразы как:
Чем я не угодил компилятору? :)
Меня больше волнует это:
Да, ошибочка вышла. Проблема в том, что я несколько раз переписывал код, и последний вариант, так как он не компилировался, протестировать не удалось. Изначально там стояло
temp.lenght() + 1
.Что касается всяких макросов, то чем typedef'ы не угодили?
typedef'ы
это хорошо, но ведь есть и другие места, где этим оператором не обойтись.( хотя, конечно, в данном случае только одно место( где вывод ), но на будущее... )Почему бы просто не использовать
std::wstringstream
?А оно будет работать в
windows
?( у меня нет возможности проверить )Ещё вопрос: насколько я помню
gcc
подwindows
не хотел компилировать строкуL"выход"
( собирась добавить ) ругался на какую-то неправильную последовательность байт. Или нет?Это стандартный класс из STL. Не вижу причин, чтобы оно не работало.
Это проблема поддержки non-ansi кодировок в cmd.exe. Не проблема стандарта.
Сохрани исходник в cp866 и все нормально выведется.
Ну да, я знаю, что это проблема
cmd.exe
. Но ведь стандарт не работает, хотя вина не его. А значит, я не мог быть 100 процентно уверен в роботоспособности. Поэтому я применял конструкции, в роботоспособности которых я уверен.Стандарт не может работать или не работать. Он может только существовать, как набор определений.
Не работать может реализация стандарта. Но в данном случае все работает, просто устройство вывода не поддерживает отображение расширенных символов cp1251 или юникода по умолчанию.
Ты можешь перенаправлять вывод cout в файл и он нормально прочитается текстовым редактором с поддержкой нужной кодировки.
такие моменты оборачивают в отдельные функции, а не меняют синтаксис языка.
У меня на VS2010 этот код не компилируется. Выводит такие ошибки:
Требует указать спецификатор типа для
win
иlinux
, а также объявить идентификаторы дляinput
,stream
иtemp
.см. выше
Мне кажется, что твой хитрый макрос должен выглядеть так:
Да, так работает. Спасибо. Но я так понял что толку от этого макроса никого. Или всё таки он есть?
Я бы сказал, что такой макрос — штука опасная. Легко можно получить странные ошибки при компиляции.
Обычно фрагменты, различные для разных ОС или версий одной ОС, оформляют просто с использованием директив условной компиляции. Примеры можно посмотреть в заголовочных файлах стандартной библиотеки (CRT) или STL.