ОБСУЖДЕНИЕ

Stdafx И Classes; Ansi И Utf-8 Rus

4 ответов 4,3 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Доброго времени суток, уважаемые форумчане.
Не хочу плодить две темы, так как думаю, ответы на мои вопросы будут довольно просты, а вопросов у меня к вам два.

Первый - это использование локали и кодировки файла.
Почему, если я пишу:
C++:
setlocale(LC_ALL, "Rus");
cout << "Привет, мир!" << endl;
То текст выведется русскими буквами, если он находится в файле исходного кода с кодировкой ANSI и выведет "Р?С?РёР?РчС', Р?РёС?!", если этот файл будет в кодировке UTF-8 (без BOM). В настройках проекта указано использовать кодировку Unicode.
Собственно, хотелось бы узнать, как можно сделать так, чтобы и исходный код был в файлах с кодировкой UTF-8, и русский язык выводился на консоль нормально?
Надеюсь, это как-то просто решается...

И второй вопрос, это использование в проекте stdafx. Я не знаю, для чего он нужен (там какие-то прекомпилированные заголовки чтоль), меня контесты сразу приучили создавать "пустой проект", но тут у меня просят помощи, так как какому-то преподавателю этот stdafx в проекте стал принципиален. Так вот, с простыми проектами, состоящими из одного файла, с stdafx проблем не было, запускались. А вот появился проектик, состоящий из main.cpp, и двух файликов с классами - вот его собрать и в правильной последовательности - никак не получается, довольно много способов уже перепробовал, но вижуалка всегда ругается. Собственно, прошу помощи собрать этот проект или подсказать, как стоит его собрать, и обнаружить причину его "несборки".

Чтобы уж вообще не думали, что я пришёл за готовыми ответами, прекрепляю архив с проектами.
TestANSIUTF - проект к первому вопросу, для удобства, в одном файле функцию можно назвать main, тогда в другом файле - main1
TestNoStdafx - рабочий проект с классами
TestStdafx - проект, который должен инклюдить дополнительно stdafx, с чем у меня сложности

Заранее спасибо, надеюсь, поможете :(Посмотреть вложение Projects.rar
 
http://habrahabr.ru/post/104417/
такая локаль: ru_RU:UTF-8», «en_US.UTF-8»

но под win работать не будет.

С stdafx я чето проблем не помню. У меня винды нет не говоря о всяких там ущербных студиях.

Если очень нужно - опиши структура проекта (какой файл куда включается), можно нарисовать. И сообщения с ошибками прикрепи.
 
С stdafx решил вроде проблему. В stdafx.h написал все возможные свои инклюды, а в оставшиеся свои файлы подключил только stdafx.h. Ну и в своих хедарах на всякий случай поставил include guard'ов :)

А на первую проблему забил, решил, что пусть просто будет кодировка у исходников ANSI, либо использовать английский язык ^_^
 
Описание stdafx.h от MS:
// stdafx.h: включите файл для добавления стандартных системных файлов или конкретных файлов проектов, часто используемых, но редко изменяемых

Вобщем идея этого файла во включении в него всех необходимых проекту хидеров, как системных так и Вашего проекта, так сказать "все в одном месте", а затем подключение его во все *cpp.
Незнаю почему, но у меня работает не совсем так как задумано MS, приходится в каждом *cpp кроме него подключать еще и хидеры классов реализованных в данном *cpp.

зы include guard'ов (или #pragma once) у меня вообще как закон, после того как, лет десять назад, полтора месяца не могли понять почему проект перестает компилироватся после добавления 512-го класса!! Думали у студии какое-то ограничение, уж больно число знакомое... Оказалось просто в одном из хидеров небыло include guard, а 512 просто роковое совпадение.
 
Описание stdafx.h от MS:
// stdafx.h: включите файл для добавления стандартных системных файлов или конкретных файлов проектов, часто используемых, но редко изменяемых

Вобщем идея этого файла во включении в него всех необходимых проекту хидеров, как системных так и Вашего проекта, так сказать "все в одном месте", а затем подключение его во все *cpp.

Нет, его идея в включении только редко изменяемых хидеров. Файлы проекта обычно ими не являются и включаться в stdafx.h не должны.
Впрочем нарушение этого правила приведет только к замедлению компиляции.