Предотвратить препроцессор C, чтобы сделать конкретную макро-замену - PullRequest
6 голосов
/ 15 ноября 2008

Как я могу сказать препроцессору не заменять определенный макрос?

Конкретная проблема заключается в следующем: заголовочные файлы Windows определяют макрос GetMessage.

Мои заголовочные файлы C ++ с моим API имеют метод GetMessage. Я не хочу переименовывать свой метод. Но при использовании API в Windows, включая windows.h, мой метод GetMessage заменяет вызов метода GetMessageA.

Ответы [ 5 ]

6 голосов
/ 15 ноября 2008

(GetMessage)(...)

GetMessage на MSDN

6 голосов
/ 15 ноября 2008

Вы пытались просто сделать

#undef GetMessage

или даже

#ifdef GetMessage
#undef GetMessage
#endif

, а затем напрямую вызывать окна GetMessageA или GetMessageW, в зависимости от того, что подходит.

вы должны знать, используете ли вы char * для wchar_t8 ..

(спасибо don.neufeld)

Брайан также говорит, что Просто немного полезной информации, вы также можете использовать #pragma push_macro / pop_macro, чтобы выдвигать и вставлять определения макросов. Это замечательно, если вы хотите переопределить определение макроса в блоке кода:

#pragma push_macro("GetMessage")
#undef GetMessage

// Your GetMessage usage/definition here

#pragma pop_macro("GetMessage")

Я подозреваю, что это специфическая особенность MS, так что имейте это в виду.

4 голосов
/ 15 ноября 2008

Просто немного полезной информации, вы также можете использовать #pragma push_macro / pop_macro, чтобы выдвигать и вставлять определения макросов. Это замечательно, если вы хотите переопределить определение макроса в блоке кода:

#pragma push_macro("GetMessage")
#undef GetMessage

// Your GetMessage usage/definition here

#pragma pop_macro("GetMessage")

Я подозреваю, что это специфическая особенность MS, так что имейте это в виду.

1 голос
/ 15 ноября 2008

Есть ли код, который вызывает как GetMessage, так и Window GetMessage?

Такой код не сможет различить их. Вы не сможете вызвать оба файла в одном файле.

Если вы используете одну функцию в одном файле, а другую - в другом, просто выполните предложенный #undef в одном файле.

0 голосов
/ 15 ноября 2008

Учитывая ваши ограничения, как указано в вашем комментарии, единственный способ сделать это - выполнить:

#undef GetMessage

прямо перед вызовом GetMessage вашего API. (И это предполагает, что никто после этой точки в исходном файле не вызывает Win32 GetMessage.)

...