Они означают, что вы должны абстрагировать свой код от системно-зависимой части с помощью абстрактных базовых классов и использовать компиляцию условий только в момент создания экземпляра.
class SystemAgnosticInterface
{
public:
virtual ~SystemAgnosticInterface() {}
virtual void doStuff() = 0;
};
В таком случае вы можете, например, иметь конкретные реализации интерфейса для Windows и Linux (каждая из которых будет включена в компиляцию только для соответствующей платформы), например:
SystemAgnosticInterface *createFoo()
{
#ifdef _WIN32
return new WindowsImplementation;
#else
return new LinuxImplementation;
#endif
}
int main()
{
SystemAgnosticInterface *foo = createFoo();
foo->doStuff(); // No conditional compilation here
delete foo;
}
Это явно упрощенный пример кода, но я надеюсь, вы поймете суть: дело не в том, чтобы полностью избегать #ifdef
, просто в том, что они не должны загромождать каждую часть вашего кода.