28 апреля 2006

#define is evil

Как часто при написании Windows приложений приходится употреблять следующую строку:
#include <windows.h>

А теперь попробуем следующий код:
// Loader.h
class Loader
{
public:
void LoadString();
}

// Loader.cpp
#include "Loader.h"
#include

void Loader::LoadString()
{
// code here
}

Попробуем откомпилировать:
error C2039: 'LoadStringA' : is not a member of 'Loader'

Вот вам и windows.h со своими #define...
Подобные вещи мешают использовать даже стандартную библиотеку - макросы min и max не дают воспользоваться шаблонами std::min и std::max.

Лучшее лекарство от подобного безобразия:
// SafeWindows.h
#pragma once

#include <windows.h>

#ifdef min
#undef min
#endif

#ifdef max
#undef max
#endif

#ifdef MessageBox
#undef MessageBox
#endif
...

// Any.cpp
#include "SafeWindows.h"

int main()
{
return ::MessageBoxW(NULL, L"#define is evil", L"Note", MB_OK);
}

Комментариев нет: