Проблема в том, что использование директивы #if с неопределенным именем действует так, как если бы оно было определено как 0. Этого можно избежать, если всегда сначала делать #ifdef, но это громоздко и чревато ошибками.
Несколько лучше использовать псевдонимы пространства имен и пространства имен.
* 1005 Е.Г. *
namespace AppA {
// application A specific
}
namespace AppB {
// application B specific
}
И используйте ваш app_defines.h для создания псевдонимов пространства имен
#if compiler_option_for_appA
namespace Application = AppA;
#elif compiler_option_for_appB
namespace Application = AppB;
#endif
Или, если более сложные комбинации, вложенное пространство имен
namespace Application
{
#if compiler_option_for_appA
using namespace AppA;
#elif compiler_option_for_appB
using namespace AppB;
#endif
}
Или любая комбинация вышеперечисленного.
Преимущество заключается в том, что если вы забудете заголовок, вы получите неизвестные ошибки пространства имен от вашего компилятора i.s.o. из-за молчаливого сбоя, потому что для ПРИЛОЖЕНИЯ по умолчанию установлено значение 0.
При этом у меня была похожая ситуация, я решил реорганизовать все во многие библиотеки, из которых подавляющее большинство составлял общий код, и позволить системе контроля версий обрабатывать то, что происходит в другом приложении i.s.o. опираясь на определения и т. д. в коде.
В моем варианте это работает немного лучше, но я знаю, что это зависит от конкретного приложения, YMMV.