Я хочу привести пример, который другие не упоминали
*, также может распаковать генератор
Пример из документа Python3
x = [1, 2, 3]
y = [4, 5, 6]
unzip_x, unzip_y = zip(*zip(x, y))
unzip_x будет [1, 2, 3], unzip_y будет [4, 5, 6]
. zip () получает несколько кривых аргументов и возвращает генератор.
zip(*zip(x,y)) -> zip((1, 4), (2, 5), (3, 6))
По моим сведениям, нет общего способа сделать это. Если вы посмотрите на заголовки кросс-платформенных / множественных библиотек, поддерживающих компилятор, вы всегда найдете множество определений, которые используют специфические для компилятора конструкции для определения таких вещей:
/*Define Microsoft Visual C++ .NET (32-bit) compiler */
#if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300)
...
#endif
/*Define Borland 5.0 C++ (16-bit) compiler */
#if defined(__BORLANDC__) && !defined(__WIN32__)
...
#endif
Вам, вероятно, придется делать такие определяет себя для всех компиляторов, которые вы используете.
В зависимости от того, чего вы хотите достичь, Boost.Config может вам помочь. Он не обеспечивает обнаружение стандартной версии, но предоставляет макросы, которые позволяют вам проверять поддержку определенных функций языка / компилятора.
Из Bjarne Stroustrup C ++ 0x FAQ :
__cplusplus
В C ++ 0x макрос
blockquote>__cplusplus
будет установлено значение, которое отличается от (больше) текущего199711L
.Хотя это не так полезно, как хотелось бы.
gcc
(видимо, в течение почти 10 лет) это значение было установлено на1
, исключая один главный компилятор, до тех пор, пока он не был зафиксирован, когда gcc 4.7.0 вышел .Это стандарты C ++ и какое значение вы должны ожидать в
__cplusplus
:
- C ++ pre-C ++ 98:
__cplusplus
is1
.- C ++ 98:
__cplusplus
is199711L
.- C ++ 98 + TR1: Это читается как C ++ 98, и нет способа проверить, что я знаю.
- C ++ 11:
__cplusplus
is201103L
.- C ++ 14:
__cplusplus
is201402L
.- C ++ 17 :
__cplusplus
is201703L
.Если компилятор может быть старше
gcc
, нам нужно обратиться к специфическому хакерству компилятора (посмотрите на макрос версии, сравните его с таблица с реализованными функциями) или используйте Boost.Config (который предоставляет соответствующие макросы ). Преимущество этого в том, что мы действительно можем выбрать конкретные функции нового стандарта и написать обходное решение, если эта функция отсутствует. Это часто предпочтительнее для оптового решения, так как некоторые компиляторы будут требовать реализовать C ++ 11, но предлагают только набор функций.В Stdcxx Wiki размещена всеобъемлющая матрица для поддержки компилятора из функций C ++ 0x (если вы решились проверить сами функции).
К сожалению, более мелкозернистая проверка функций (например, отдельные функции библиотеки, такие как
std::copy_if
) может выполняться в системе сборки вашего приложения (запустить код с помощью функции, проверить, скомпилирован ли он и получить правильные результаты -autoconf
является инструментом выбора при прохождении этого маршрута).
201300
в качестве значения __cplusplus
.
– Gabriel Staples
12 August 2017 в 14:30
__cplusplus
только в VS 15.7. См. Их Visual C ++ Team Blog
– Ivan_Bereziuk
4 July 2018 в 09:51
Пожалуйста, запустите следующий код, чтобы проверить версию.
#include<iostream>
int main() {
if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
}
После быстрого google :
__STDC__
и __STDC_VERSION__
, см. здесь
__STDC__
и каково его значение, определены в C ++.
– Rob Kennedy
24 February 2010 в 09:57
__ cplusplus
В C ++ 0x макрос __cplusplus будет установлен в значение, которое отличается от (больше) текущего 199711L.
blockquote>