Тема: Як зробити код переносимим/сумісним для різних компіляторів ?
Є в мене код на C++ (загалом), успішно компілюється, добре працює, але тільки в мене (ну і на інших машинах, якщо поставити той самий компілятор).
І є проблемка, цей код в майбутньому буде компілюватися на машинах, про які мені нічого не відомо. Не відомо які операційні системи, які компілятори там будуть поставлені. Відомо лише, що доставляти новіші компілятори ніхто не буде і мені треба подбати про те, щоб код компілювався всюди. Як мені це зробити ?
З самого початку код писався на Visual C++ 2013. Пробував запускати старішими компіляторами, і там були деякі несумісні куски коду, ну я прочитав про макроси визначені різними компіляторами, і зумів зробити код сумісним з усіма лайнософтівськими компіляторами починаючи з 2005 року випуску.
В двох словах / сильно спрощені приклади коду:
Було
void func(const int &i) { /* ... */ }
void func(int &&i) { /* ... */ }
void main()
{
int &&i00 = 0;
int i01 = i00;
int &i02 = i01;
func(std::move(i00));
func(i01);
func(i02);
}
Стало
#if !defined(nullptr) && (!defined(_MSC_VER) || _MSC_VER < 1600)
#define nullptr 0
#endif // #if !defined(nullptr) && (!defined(_MSC_VER) || _MSC_VER < 1600)
void func(const int &i) { /* ... */ }
#if !defined(_MSC_VER) || _MSC_VER >= 1600
void func(int &&i) { /* ... */ }
#endif // end for #if
void main()
{
#if !defined(_MSC_VER) || _MSC_VER >= 1600
int &&i00 = 0;
int i01 = i00;
#else
int i01 = 0;
#endif // #if !defined(_MSC_VER) || _MSC_VER >= 1600 #else
int &i02 = i01;
#if !defined(_MSC_VER) || _MSC_VER >= 1600
func(std::move(i00));
#endif // #if !defined(_MSC_VER) || _MSC_VER >= 1600
func(i01);
func(i02);
}
Наведений код, звичайно, не той, над яким я працюю, але цей приклад дуже вдало передає суть. Розмір коду виріс, майже в 2 рази, і це тільки для Visual C++. А ще потрібно для інших постаратись.
Це я виклав, щоб показати, які способи я використовую на шляху до сумісності. Чи є ще якісь способи ?
Є досить велика ймовірність, що код буде компілюватись під лінукси і маки. Із цього виникає питання: Як дізнатись, які можливості підтримують різні компілятори різних версій ?
Може є якийсь повний список в тирнеті ?, де це все можна почитати...
Крім того в деяких старих компіляторах можна зустріти баги типу такого.
Чи є якісь списки, де можна зустріти всі можливі баги ?
І що Ви робите, коли потрібно досягнути сумісності з різними компіляторами ?
Якщо знаєте якісь туторіали по цьому, накидайте посилань сюди.