Від Bjarne Stroustrup C ++ 0x FAQ :
__cplusplus
У C ++ 0x макросу __cplusplus
буде встановлено значення, яке відрізняється від (більше, ніж) поточного 199711L
.
Хоча це не так корисно, як хотілося б. gcc
(мабуть, протягом майже 10 років) було встановлено це значення 1
, виключаючи одного основного компілятора, поки воно не було встановлено, коли вийшов gcc 4.7.0 .
Це стандарти C ++, і яке значення ви повинні мати на очікування у __cplusplus
:
- C ++ pre-C ++ 98:
__cplusplus
є 1
.
- C ++ 98:
__cplusplus
є 199711L
.
- C ++ 98 + TR1: Це означає, що C ++ 98, і немає можливості перевірити, що я знаю.
- C ++ 11:
__cplusplus
є 201103L
.
- C ++ 14:
__cplusplus
є 201402L
.
- C ++ 17:
__cplusplus
є 201703L
.
Якщо компілятор може бути старшим gcc
, нам потрібно вдатися до конкретного хакерського компілятора (подивіться на макрос версії, порівняйте його з таблицею з реалізованими функціями) або скористайтеся Boost.Config (який надає відповідні макроси ). Перевагою цього є те, що ми фактично можемо вибрати конкретні особливості нового стандарту та написати вирішення, якщо функція відсутня. Це часто надається перевагу над оптовим рішенням, оскільки деякі компілятори вимагають впровадити C ++ 11, але пропонують лише підмножину функцій.
У Stdcxx Wiki розміщена вичерпна матриця для підтримки компілятора функцій C ++ 0x (якщо ви зважилися перевірити їх на себе).
На жаль, більш точну перевірку функцій (наприклад, окремих функцій бібліотеки на зразок std::copy_if
) можна здійснити лише в системі збирання вашої програми (запустіть код за допомогою функції, перевірте, чи вона зібрала та дали правильні результати - autoconf
це інструмент вибору, якщо брати цей маршрут).