Как только вы узнаете о проблемах, на самом деле это не так сложно. Весь код, над которым я сейчас работаю, компилируется на 32- и 64-битной Windows, все версии Linux , а также Unix (Sun, HP и IBM). Очевидно, что это не продукты GUI. Кроме того, мы не используем сторонние библиотеки, если сами не собираем их.
У меня есть один файл .h, который содержит весь специфичный для компилятора код. Например, Microsoft и gcc не согласны с тем, как указать 8-разрядное целое число. Так что в .h, у меня есть
#if defined(_MSC_VER)
typedef __int8 int8_t;
#elif defined(__unix)
typedef char int8_t;
#endif
Существует также довольно много кода, который унифицирует определенные вызовы функций более низкого уровня, например:
#if defined(_MSC_VER)
#define SplitPath(Path__,Drive__,Name__,Ext__) _splitpath(Path__,Drive__,Dir__,Name__,Ext__)
#elif defined(__unix)
#define SplitPath(Path__,Drive__,Name__,Ext__) UnixSplitPath(Path__,Drive__,Name__,Ext__)
#endif
Теперь, в этом случае, я считаю, что мне нужно было написать функцию UnixSplitPath () - будут времена, когда вам нужно. Но в большинстве случаев вам просто нужно найти правильную функцию замены. В моем коде я буду вызывать SplitPath (), даже если это не встроенная функция ни на одной платформе; #defines разберутся для меня. Тренироваться нужно некоторое время.
Верьте или нет, мой .h файл имеет длину всего 240 строк. Там действительно не так много. И это включает в себя обработку проблем с порядком байтов.
Некоторые вещи более низкого уровня потребуют условной компиляции. Например, в Windows я использую критические разделы, но в Linux мне нужно использовать pthread_mutex. CriticalSection были инкапсулированы в класс, и у этого класса есть много условной компиляции. Однако программа верхнего уровня совершенно не осведомлена, класс функционирует совершенно одинаково независимо от платформы.
Другой секрет, который я могу вам дать: часто создавайте свой проект на всех платформах (особенно в начале). Это намного проще, когда вы устраняете проблемы компилятора в зародыше. Не ждите, пока закончите разработку, прежде чем пытаться перейти на кроссплатформенность.