При разработке на С++ кроссплатформенного приложения разумно выделить платформо-зависимые части в отдельные пространства имён. Например, части, относящиеся только к операционным системам семейства Windows, в пространство имён windows. Это хорошая идея. Однако здесь есть крайне не очевидный подводный камень. Дело в том, что в компиляторе gcc нельзя создать пространство имён с именем linux.
Рассмотрим пример простейшей программы:
#include <stdio.h> namespace linux {} int main() { return 0; }
Она ничего не делает. Но при попытке ее скомпилировать в gcc мы получим ошибку:
Из текста сообщения можно предположить, что имя linux конфликтует с именем константы. И такая константа действительно существует. Пример ниже нормально компилируется и работает.
#include <stdio.h> int main() { printf("%d\r\n", linux); return 0; }
На моем домашнем компьютере он выводит единицу.
Такое поведение специфично только для компилятора gcc. На других компиляторах (с которыми работал лично я) проблем с объявлением пространства имён linux — нет.
Это макрос препроцессора, определённый только на Linux
#ifdef linux
…
#endif