Define гадит в проект
От: buka123  
Дата: 19.10.09 04:09
Оценка: :))) :)
В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?
Re: Define гадит в проект
От: Bell Россия  
Дата: 19.10.09 04:21
Оценка:
Здравствуйте, buka123, Вы писали:

B>В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?

Кого именно? Класс или дефайн?

Начать можно с того, что получить файл после обработки препроцессором.
Любите книгу — источник знаний (с) М.Горький
Re: Define гадит в проект
От: K13 http://akvis.com
Дата: 19.10.09 06:05
Оценка:
B>В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?

Не использовать имена методов, которые совпадают с функциями WinAPI
Re[2]: Define гадит в проект
От: buka123  
Дата: 19.10.09 06:07
Оценка:
Здравствуйте, K13, Вы писали:

B>>В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?


K13>Не использовать имена методов, которые совпадают с функциями WinAPI

Такое не катит, слишком много на него завязанно.
Re[2]: Define гадит в проект
От: buka123  
Дата: 19.10.09 06:10
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, buka123, Вы писали:


B>>В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?

B>Кого именно? Класс или дефайн?

B>Начать можно с того, что получить файл после обработки препроцессором.


Получил многомегабайтные файлы, а дальше что?
Re[3]: Define гадит в проект
От: Caracrist https://1pwd.org/
Дата: 19.10.09 06:37
Оценка:
Здравствуйте, buka123, Вы писали:

B>Здравствуйте, K13, Вы писали:


B>>>В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?


K13>>Не использовать имена методов, которые совпадают с функциями WinAPI

B>Такое не катит, слишком много на него завязанно.

Если проблема в самих функциях API тогда, кто-то там у вас не прав. Либо используйте названия без A и W с расчётом на те самые дефаины. Либо используйте сразу с A и W, и тогда все эти дефайны не для вас...
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: Define гадит в проект
От: Bell Россия  
Дата: 19.10.09 06:38
Оценка:
Здравствуйте, buka123, Вы писали:

B>>Начать можно с того, что получить файл после обработки препроцессором.


B>Получил многомегабайтные файлы, а дальше что?


Я что-то теряю мысль — в чем собственно проблема? В том, что у твоего класса есть функции, имена которых совпадают с API-шными? Если да — ты знаешь эти имена?
Любите книгу — источник знаний (с) М.Горький
Re[4]: Define гадит в проект
От: buka123  
Дата: 19.10.09 06:52
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, buka123, Вы писали:


B>>>Начать можно с того, что получить файл после обработки препроцессором.


B>>Получил многомегабайтные файлы, а дальше что?


B>Я что-то теряю мысль — в чем собственно проблема? В том, что у твоего класса есть функции, имена которых совпадают с API-шными? Если да — ты знаешь эти имена?

Да,некоторые методы совпадают в винапишными. Да, я знаю эти имена.
Re[5]: Define гадит в проект
От: Caracrist https://1pwd.org/
Дата: 19.10.09 07:09
Оценка:
Здравствуйте, buka123, Вы писали:

B>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, buka123, Вы писали:


B>>>>Начать можно с того, что получить файл после обработки препроцессором.


B>>>Получил многомегабайтные файлы, а дальше что?


B>>Я что-то теряю мысль — в чем собственно проблема? В том, что у твоего класса есть функции, имена которых совпадают с API-шными? Если да — ты знаешь эти имена?

B>Да,некоторые методы совпадают в винапишными. Да, я знаю эти имена.

можешь наставить #undef где нужно
~~~~~
~lol~~
~~~ Single Password Solution
Re[6]: Define гадит в проект
От: buka123  
Дата: 19.10.09 07:12
Оценка: :)
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, buka123, Вы писали:


B>>Здравствуйте, Bell, Вы писали:


B>>>Здравствуйте, buka123, Вы писали:


B>>>>>Начать можно с того, что получить файл после обработки препроцессором.


B>>>>Получил многомегабайтные файлы, а дальше что?


B>>>Я что-то теряю мысль — в чем собственно проблема? В том, что у твоего класса есть функции, имена которых совпадают с API-шными? Если да — ты знаешь эти имена?

B>>Да,некоторые методы совпадают в винапишными. Да, я знаю эти имена.

C>можешь наставить #undef где нужно

Можно, но как-то не круто
Re[5]: Define гадит в проект
От: Bell Россия  
Дата: 19.10.09 07:32
Оценка: +1
Здравствуйте, buka123, Вы писали:

B>>Я что-то теряю мысль — в чем собственно проблема? В том, что у твоего класса есть функции, имена которых совпадают с API-шными? Если да — ты знаешь эти имена?

B>Да,некоторые методы совпадают в винапишными. Да, я знаю эти имена.

ИМХО единственный выход — изменить эти имена. Иначе ты не сможешь защитить пользователей своего класса — любой новый #include может все сломать.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Define гадит в проект
От: bkat  
Дата: 19.10.09 08:15
Оценка:
Здравствуйте, buka123, Вы писали:

B>Здравствуйте, K13, Вы писали:


B>>>В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?


K13>>Не использовать имена методов, которые совпадают с функциями WinAPI

B>Такое не катит, слишком много на него завязанно.

А вариантов на самом деле только два:
— Переименовать ваши методы
— не инклудить windows.h там, где есть конфликт.

Что проще — тебе виднее.
Re[4]: Define гадит в проект
От: Анатолий Широков СССР  
Дата: 19.10.09 09:06
Оценка:
B>>Такое не катит, слишком много на него завязанно.

B>А вариантов на самом деле только два:

B>- Переименовать ваши методы
B>- не инклудить windows.h там, где есть конфликт.

B>Что проще — тебе виднее.


Есть еще третий вариант — там где используется "конфликтный класс" обрамлять имя класса в скобки. Это предотвратит макроподстановку. Но это, конечно, уж очень экзотический вариант. Что мешает переименовать класс, если исходники все под рукой?
Re: Define гадит в проект
От: _Paul Россия  
Дата: 19.10.09 09:40
Оценка:
Здравствуйте, buka123, Вы писали:

B>В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?


Можно воспользоваться #undef или #pragma push_macro/pop_macro, но лучше все-же переименовать методы.
Re[5]: Define гадит в проект
От: Bell Россия  
Дата: 19.10.09 09:46
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

B>>Что проще — тебе виднее.


АШ>Есть еще третий вариант — там где используется "конфликтный класс" обрамлять имя класса в скобки. Это предотвратит макроподстановку. Но это, конечно, уж очень экзотический вариант.

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

АШ>Что мешает переименовать класс, если исходники все под рукой?

ИМХО это единственный приемлемы вариант.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Define гадит в проект
От: buka123  
Дата: 19.10.09 09:47
Оценка:
Здравствуйте, _Paul, Вы писали:

_P>Здравствуйте, buka123, Вы писали:


B>>В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?


_P>Можно воспользоваться #undef или #pragma push_macro/pop_macro, но лучше все-же переименовать методы.


Но ведь можно сделать так, чтоб винапишный заголовок инклюдился позже.
Re: Define гадит в проект
От: Sheridan Россия  
Дата: 19.10.09 11:17
Оценка:
Приветствую, buka123, вы писали:

b> В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?


IDE какое?
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[3]: Define гадит в проект
От: Кодт Россия  
Дата: 19.10.09 15:17
Оценка: 2 (1)
Здравствуйте, buka123, Вы писали:

B>Но ведь можно сделать так, чтоб винапишный заголовок инклюдился позже.


У тебя тогда будет редкая каша из имён.
struct Foo
{
    void MessageBox();
};

#include <windows.h>

int main()
{
    Foo f; f.MessageBox();
}

/// превратится в

struct Foo
{
    void MessageBox();
};

.....

int main()
{
    Foo f; f.MessageBoxW();
}


Так что, на самом деле, правильный выход — обеспечить, чтобы винапишный заголовок всегда включался раньше. Даже если он тебе и не нужен в каком-то конкретном месте.
Чтобы снизить нагрузку на компилятор, помести #include<windows.h> в прекомпилированный заголовок (stdafx.h и т.п.)

Да, в итоге у тебя вместо Foo::MessageBox будет Foo::MessageBoxW (или -A, в зависимости от юникодности). Но это будет повсеместно и согласованно, и волновать тебя не очень должно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[4]: Define гадит в проект
От: Sergey Россия  
Дата: 19.10.09 15:24
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Так что, на самом деле, правильный выход — обеспечить, чтобы винапишный заголовок всегда включался раньше. Даже если он тебе и не нужен в каком-то конкретном месте.

К>Чтобы снизить нагрузку на компилятор, помести #include<windows.h> в прекомпилированный заголовок (stdafx.h и т.п.)

К>Да, в итоге у тебя вместо Foo::MessageBox будет Foo::MessageBoxW (или -A, в зависимости от юникодности). Но это будет повсеместно и согласованно, и волновать тебя не очень должно.


Ага, пока с библиотекой какой не пересечется Ну а потом начнутся вопросы в форум, типа "а чё у меня линкер конструктор boost::archive::archive_exception не видит?"
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Define гадит в проект
От: Кодт Россия  
Дата: 19.10.09 15:28
Оценка:
Здравствуйте, buka123, Вы писали:

B>В проекте есть класс, который страдает от дефайна WinApi , который прибавляет к именам функций "A" или "W". Как можно отследить его и убить?


Кстати, хочу заметить: этот злодейский дефайн — это UNICODE, и он ничего никуда не добавляет.
Просто винапишные хедеры содержат примерно такие строки
int WINAPI MessageBoxA(HWND,LPCSTR,LPCSTR,UINT);
int WINAPI MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT);
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.