писать код, который поддерживает новые и старые компиляторы c ++? - PullRequest
1 голос
/ 15 февраля 2012

Мне нужно написать код, который может поддерживать новые и старые компиляторы, и мне было интересно, прежде чем я начну, возможно ли что-то подобное?

#ifndef C++11 { //some code..... } 
#endif 

else 

#ifndef older C++ version { //some code......}
#endif

Ответы [ 5 ]

6 голосов
/ 15 февраля 2012

Стандарт требует, чтобы реализации, соответствующие C ++ 11, определяли макрос с именем __cplusplus и значением 201103L.Несоответствующим компиляторам рекомендуется использовать значение не более пяти десятичных цифр.То же самое было верно для C ++ 03, где значение, к которому это должно быть определено, равно 199711L.

Однако, не многие компиляторы считают (ed) себя соответствующими стандартам, и, например, gcc определил это в течение длительного временибыть просто 1L.Также вы должны учитывать, что это не только версия компилятора, но и параметры компилятора.Gcc поддерживает (частично) C ++ 11 только когда вы передаете -std=c++0x или -std=gnu++0x.В этих случаях он будет определять макрос __GXX_EXPERIMENTAL_CXX0X__.

. Таким образом, наиболее переносимым решением является непереносимость и наличие собственного макроса, который вы установили при обнаружении поддержки C ++ 11, и наличие некоторого заголовка / настройкискрипт, в котором вы используете вышеупомянутые вещи, а также, возможно, другие для других поддерживаемых компиляторов.

3 голосов
/ 15 февраля 2012

Нет простого универсального макроса, и для большинства компиляторов это не двоичное «да или нет». Большинство компиляторов реализуют некоторые функции C ++ 11, но, конечно, не все.

MSVC просто имеет один макрос _MSC_VER, указывающий версию компилятора, и если вы знаете, какие функции поддерживаются в какой версии, то вы можете использовать это.

Clang имеет довольно подробные макросы, относящиеся к конкретным функциям, вида _HAS_<feature> (не помню, точное ли это имя).

Если вы хотите узнать во всех компиляторах, доступна ли функция X, вам придется проверить все эти различные макросы и определить ответ самостоятельно. :)

1 голос
/ 15 февраля 2012

Напишите ваш код для совместимости с самым последним компилятором.

Любой код, который не будет компилироваться со старой версией, должен быть извлечен в его собственный модуль .cpp.

ЗатемАльтернативный .cpp должен быть написан для старого компилятора.

Для более старых сборок выберите включение более старых .cpp.

Вам не нужно # определяет.

См. # ifdef считается опасным

1 голос
/ 15 февраля 2012

Комитет по стандартам C ++ приложил немало усилий, чтобы убедиться, что любой код, написанный в старом стандарте, все еще действует в новом стандарте. И если вам приходится обходиться без функции на некоторых платформах, ее использование на других - это большая работа, которая редко приносит какую-либо выгоду. Так что просто придерживайтесь старой версии, которую вам нужно поддерживать.

За немногими исключениями, самый надежный способ - протестировать компилятор и определить макросы для выбора версии, которую вы хотите использовать. Либо вручную, если вы знаете свой набор компиляторов, либо используйте что-то вроде autoconf или cmake, если не знаете. Есть много компиляторов, которые поддерживают некоторые функции C ++ 11, а не другие, поэтому мало надежды найти какой-то тест, который подойдет без какой-либо работы с вашей стороны. Я полагаю, что все функции могут быть протестированы с помощью только компиляции; если они компилируются, они, как правило, также будут работать.

1 голос
/ 15 февраля 2012

В MSVS у вас есть макрос, _MSC_VER, который может вам помочь. Я не знаю, есть ли такой стандартный макрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...