здравствуйте, дружыщща. нигде не могу информацию о том, как корректно работать с строковыми типами данных в MSVC, чтобы тем самым обеспечить работоспособность кода, перенесенного с одной Студии на другую, имеющую разные настройки проджекта. допустим, есть такой кусочег кода: Код (Text): #include "stdafx.h" #include <afxwin.h> #include <iostream> using namespace std; int main() { CFileFind finder; BOOL bWorking = finder.FindFile(("*.*")); while (bWorking) { bWorking = finder.FindNextFile(); cout << (LPCTSTR) finder.GetFileName() << endl; } return 0; } если в св-вах проджекта стоит Character Set: not set; то все окей если же указать Character Set: use UNICODE Character Set; то получаем хочу научиться писАть так, чтобы работа с строковыми типами данных в коде корректно работала при _любых_ выставленных "Character Set"-aх у проджектов. подскажите пару финтов? спасибо.
Использовать TCHAR, который раскрывается в char при ANSI настройках и в wchar при UNICODE. Код (Text): #include <tchar.h> TCHAR Str[]=_T("some string");
хорошо, это понятно... а если я работаю с MFC классами, как в моем примере выше? кстати, этот пример из MSDN. как его дополнить, чтобы ему были глубоко фиолетовы конкретные выставленные настройки проджекта в плане Character Set?
n0name уже пробовал. в случае, когда в св-вах проджекта указано: Character Set: use UNICODE Character Set вместо списка файлов при запуске получаем
varnie Код (Text): virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwUnused = 0); и вообще, CFileFind работает почти везде с CString, к-рый по сути CStringT
Код (Text): #include "stdafx.h" #include <afxwin.h> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { CFileFind finder; BOOL bWorking = finder.FindFile(TEXT("*.*")); while (bWorking) { bWorking = finder.FindNextFile(); [b]wcout[/b] << (LPTSTR)finder.GetFileName().GetString() << endl; } return 0; }
http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2007-07/msg00018.html Код (Text): #ifndef UNICODE #define STDTCOUT std::cout #else #define STDTCOUT std::wcout #endif
nobodyzzz прогнал при всех разных настройках кодировки проджекта - во всех случаях работает верно. n0name твой вариант не завелся вообще, хотя я испробовал все 3 параметра для кодировки. flankerx да, вариант с глобальным дефайном работает. но неужели все так сложно в MS VC королевстве? :-( интересно то, что в этом дефолтном примере из MSDN не приведено таки общее решение, учитывающее различные параметры проджекта в плане кодировки. моя проблема, что я фактически не знаком вообще со Студией, т.к. все это время писал на чистом C++, игнорируя мир IDE... а сейчас вся эта микрософтовская лабудень с кодировками, миллионами макросов итд меня сбивает с толку. подскажите, как с этим подружиться все же?
Так уж получилось. Для std::basic_stream есть перегрузка для преобразования char в wchar_t, а вот наоборот - нет. Поэтому проще использовать во всех случаях std::wcout. Не MFC единым живёт человек, есть куча альтернатив.
IceStudent Можно подробней? Только не о VCL и QT. И ещё можете какие библиотеки посоветовать ,типа буста, для ежедневной рутины. Так сказать джентельменский C++ набор библиотек кодера.
IceStudent эти сведения запомню, спасибо. да, это так, и тут сложно и поспорить но MFC в подавляющем большинстве случаев, равно как и сама Студия, значится в требованиях у контор.