быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
Как отменить действие макроса UNICODE?19.09.2014, 19:08. Показов 5258. Ответов 15
Метки нет (Все метки)
Друзья! Недавно качнул один из компиляторов компилятор gcc, вот начинаю работать. Создал диалоговое окно (конструктором форм), но хоть код и минимальный, но файлов с исходниками несколько, все их не выкладываю поэтому. Есть там такая функция:
0
|
19.09.2014, 19:08 | |
Ответы с готовыми решениями:
15
Как отменить действие макроса Как отменить действие обработчика? Как отменить действие стиля? Как отменить следующие действие |
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
|
|
19.09.2014, 20:13 | 2 |
Все "макросовые" дефайны, насколько я знаю, делаются в самом самом верху над инклюдами.
Добавлено через 1 минуту А, еще попробуйте настройки проекта посмотреть.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
19.09.2014, 21:22 | 3 | |||||
Как уже сказал inst_mefi имеет смысл менять в свойствах проекта. Ну а тут
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
||||||
19.09.2014, 22:09 [ТС] | 4 | |||||
не помогло.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++ а где он может анализироваться? Мест не так много на самом деле. В проекте образуются два хидера, вот они: prApp.h
//---------------------------------------------------------------------------
// // Name: prApp.h // Author: ser // Created: 19.09.2014 10:10:07 // Description: // //--------------------------------------------------------------------------- #ifndef __PRDLGApp_h__ #define __PRDLGApp_h__ #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include <wx/wx.h> #else #include <wx/wxprec.h> #endif class prDlgApp : public wxApp { public: bool OnInit(); int OnExit(); }; #endif prDlg.h
///-----------------------------------------------------------------
/// /// @file prDlg.h /// @author ser /// Created: 19.09.2014 10:10:07 /// @section DESCRIPTION /// prDlg class declaration /// ///------------------------------------------------------------------ #ifndef __PRDLG_H__ #define __PRDLG_H__ #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include <wx/wx.h> #include <wx/dialog.h> #else #include <wx/wxprec.h> #endif //Do not add custom headers between //Header Include Start and Header Include End. //wxDev-C++ designer will remove them. Add custom headers after the block. ////Header Include Start ////Header Include End ////Dialog Style Start #undef prDlg_STYLE #define prDlg_STYLE wxCAPTION | wxSYSTEM_MENU | wxDIALOG_NO_PARENT | wxMINIMIZE_BOX | wxCLOSE_BOX ////Dialog Style End class prDlg : public wxDialog { private: DECLARE_EVENT_TABLE(); public: prDlg(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("pr"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = prDlg_STYLE); virtual ~prDlg(); void prDlgActivate(wxActivateEvent& event); void prDlgActivateApp(wxActivateEvent& event); void prDlgEnterWindow(wxMouseEvent& event); private: //Do not add custom control declarations between //GUI Control Declaration Start and GUI Control Declaration End. //wxDev-C++ will remove them. Add custom code after the block. ////GUI Control Declaration Start ////GUI Control Declaration End private: //Note: if you receive any error with these enum IDs, then you need to //change your old form code that are based on the #define control IDs. //#defines may replace a numeric value for the enum names. //Try copy and pasting the below block in your old form header files. enum { ////GUI Enum Control ID Start ////GUI Enum Control ID End ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values }; private: void OnClose(wxCloseEvent& event); void CreateGUIControls(); }; #endif А в них в общей сложности существует 5 подключений как бы внешних хидеров, идущих в комплекте с компилятором.
prApp.h
//---------------------------------------------------------------------------
// // Name: prApp.h // Author: ser // Created: 19.09.2014 10:10:07 // Description: // //--------------------------------------------------------------------------- #ifndef __PRDLGApp_h__ #define __PRDLGApp_h__ #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #undef UNICODE #include <wx/wx.h> #else #undef UNICODE #include <wx/wxprec.h> #endif class prDlgApp : public wxApp { public: bool OnInit(); int OnExit(); }; #endif prDlg.h
///-----------------------------------------------------------------
/// /// @file prDlg.h /// @author ser /// Created: 19.09.2014 10:10:07 /// @section DESCRIPTION /// prDlg class declaration /// ///------------------------------------------------------------------ #ifndef __PRDLG_H__ #define __PRDLG_H__ #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #undef UNICODE #include <wx/wx.h> #undef UNICODE #include <wx/dialog.h> #else #undef UNICODE #include <wx/wxprec.h> #endif //Do not add custom headers between //Header Include Start and Header Include End. //wxDev-C++ designer will remove them. Add custom headers after the block. ////Header Include Start ////Header Include End ////Dialog Style Start #undef prDlg_STYLE #define prDlg_STYLE wxCAPTION | wxSYSTEM_MENU | wxDIALOG_NO_PARENT | wxMINIMIZE_BOX | wxCLOSE_BOX ////Dialog Style End class prDlg : public wxDialog { private: DECLARE_EVENT_TABLE(); public: prDlg(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("pr"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = prDlg_STYLE); virtual ~prDlg(); void prDlgActivate(wxActivateEvent& event); void prDlgActivateApp(wxActivateEvent& event); void prDlgEnterWindow(wxMouseEvent& event); private: //Do not add custom control declarations between //GUI Control Declaration Start and GUI Control Declaration End. //wxDev-C++ will remove them. Add custom code after the block. ////GUI Control Declaration Start ////GUI Control Declaration End private: //Note: if you receive any error with these enum IDs, then you need to //change your old form code that are based on the #define control IDs. //#defines may replace a numeric value for the enum names. //Try copy and pasting the below block in your old form header files. enum { ////GUI Enum Control ID Start ////GUI Enum Control ID End ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values }; private: void OnClose(wxCloseEvent& event); void CreateGUIControls(); }; #endif
0
|
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
|
|
19.09.2014, 22:17 | 5 |
kravam, в начале каждого файла, где есть #include <something(файл созданный не вами)> напишите #undef UNICODE. Упрощая слова Tulosba.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
19.09.2014, 22:27 [ТС] | 6 |
Не помогло. Там два хидера и два *.cpp, я в начале каждого прописал #undef UNICODE, а оно всё равно вместо
FindFirstFile подставляет FindFirstFileW
0
|
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
|
|
19.09.2014, 22:29 | 7 |
kravam, мде... я, к сожалению в вашей среде не работал, деталей не знаю. Ну в крайнем случае вы можете руками прописать FindFirstFileA и будет вам счастье.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
19.09.2014, 22:33 [ТС] | 8 |
Нет. Дело в том, что там кроме этой функции ещё и другие функции есть, везде не перенаписываешься. Кроме того, эти функции принимают аргументы и они все должны соответствовать тык скыть всему и вся. В общем, надо отменить юникод для всего проекта разом.
0
|
Ушел с форума
|
|
19.09.2014, 22:41 | 9 |
Стоит попробовать "-U UNICODE" в командной строке компилятора.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
19.09.2014, 22:50 [ТС] | 10 |
Не помогает. Я аж в три места этот параметр прописал.
0
|
Ушел с форума
|
|
19.09.2014, 22:56 | 11 |
Такого просто не может быть.
UNICODE где-то да определен, либо в командной строке компилятора, либо в подключенных заголовках. В Visual C++ я бы дал команду построить файл с препроцессинговым выводом и нашел бы там злосчастную строку. Как это сделать в GCC/MinGw - не в курсе...
1
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
19.09.2014, 23:02 | 12 |
Потому что -U работает только если макрос до этого тоже был определен в командной строке.
Стоит все-таки поискать файл где unicode выставляется. И что-то подсказывает мне, что это делается внутри библиотеки wx - она может быть так собрана, c этим макросом (что-то вроде wxUSE_UNICODE при сборке библиотеки). Если это действительно так, то категорически не рекомендую локально отключать unicode у себя, чревато нарушением ODR со всеми вытекающими.
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||||||||||||
20.09.2014, 21:50 [ТС] | 13 | ||||||||||||||||||||
Друзья! Я ковырялся-ковырялся с кодом, упрощал его до минимума и вот что получилось:
Компилим, получаем ошибку, из-за который весь сыр-бор разгорелся (первоначально я использовал функцию FindFirstFile, но лучше MessageBox, она попроще будет) ошибка:
И возвращаясь к моему вопросу: где мне ВОТ ТУТ его убрать?
Но я так работал раньше, а щас хочу цивилизованнно. Повторюсь, не лезть своими толстыми пальцами в штатные инклуды, а изящно где-нибудь в своём аворском файле отменить макрос UNICODE. Неужели не получится?
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|||||||||||
20.09.2014, 22:12 | 14 | ||||||||||
Посмотрел сейчас h-файлы в каталоге wx. Нашел вот что в wx\platform.h:
Выхода я вижу три: 1) Не использовать WinAPI вообще. Вместо этого использовать соответствующие возможности библиотеки wx. Это наиболее правильный способ на мой взгляд. 2) Перекомпилировать (или найти готовую) версию wx в ANSI режиме (без юникода). 3) Использовать функции WinAPI с указанием конкретных версий (W или A).
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
20.09.2014, 22:54 [ТС] | 15 | ||||||||||
Так там ни документации, ничё. Какая-то скудная книжонка Programming with wxDev-C++ гуляет по сети, в которой есть такие строки:
Другое дело, что мне вот тут подумалось, что, наверное, есть всё-таки смысл жёстко вбить юникод в программу создания диалоговое окно, что и было ими сделано. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Значит, можно явно указывать A или W, это да. Значит, тут так- этот способ хорош, если пишешь исходник с ноля. А если берёшь уже готовый код, написанный ранее, где предполагается, что все функции "A", тогда всё плохо. И дело не в том, что вручную всё заменять придётся дело в том, что очень легко пропустить, что именно нужно заменять . Пример. Пишем:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Мне кажется, есть четвёртый хороший способ. Писать сторонний код без юникода и оформлять его в виде функций. А потом просто линковать с юникодовским кодом и всё. Зря что ли придумали раздельную компиляцию? ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0
|
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
20.09.2014, 23:05 | 16 |
Это не так в случае wx. Потому что wx - это целый фреймворк, причем кроссплатформенный (как и Qt). Поэтому там и должны быть API заменители, чтобы сделать код переносимым между платформами. Документация там есть. Обрати внимание, что там есть классы и для работы с файлами и для многопоточности и т.п. Также есть книга, не знаю есть ли она на русском. В общем материала достаточно на самом деле.
Так что я буду настаивать, что использовать WinAPI совместно с wx, как ты сказал, нецивилизованно. Это тоже самое, что использовать WinAPI совместно с Qt. Можно, но в очень ограниченных случаях. Можно, но это костыль.
0
|
20.09.2014, 23:05 | |
20.09.2014, 23:05 | |
Помогаю со студенческими работами здесь
16
Отменить действие как в блокноте Как отменить действие утилиты sysprep? Как отменить последнее действие в DataGridView1 TabControl как отменить действие CTRL+PageUp Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |