yms: (Default)
Michael Yutsis ([personal profile] yms) wrote2008-11-20 07:36 pm
Entry tags:

заметки извращенца

Вздумалось мне определить в C++-ном .h дефайны типа #define MYSTRING "mystring" так, чтобы их можно было использовать и из C++/win32, и из C#/.NET. Для второго случая я давно придумал писать промежуточный класс на C++/CLR, содержащий дотнетовские строковые костанты, инициализируемые из тех же дефайнов, которые инклудятся из общего .h. Цель изврата - если когда-нибудь захочется поменять строку, делать это только в одном месте, всё остальное поменяется автоматом при компиляции всей системы.

Геморрой начался, когда я в виндовом C++ решил передавать эти строки COM-вызовам без промежуточного преобразования в BSTR, то есть использовать в вызовах widechar-строки. Пытался приписать букву L к дефайну через пробел, но компилятор сказал "не знаю символа L". Пытался использовать конкатенацию строк, но компилятор на L"" MYSTRING и на MYSTRING L"" ругался "вы задали строки разной ширины символов". Пока что решение нашел такое: определять их в дефайнах сразу с L — #define MYSTRING L"mystring", благо компилятор c++/clr распрекрасно понимает такие литералы. Но если в обычном C++ вдруг понадобится их использовать без L, тады ой.

upd: проблема решается использованием макроса #define OLESTR(str) L##str, но выходит довольно громоздко — эта штука работает только внутри дефайна, так что надо писать вторую группу дефайнов, ссылающуюся на первую.