Существует ли #define для скомпилированной версии C ++? [Дубликат]

Я хочу привести пример, который другие не упоминали

*, также может распаковать генератор

Пример из документа 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))
69
задан jasonline 24 February 2010 в 10:21
поделиться

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

Вам, вероятно, придется делать такие определяет себя для всех компиляторов, которые вы используете.

7
ответ дан RED SOFT ADAIR 28 August 2018 в 05:50
поделиться
  • 1
    Не мой ожидаемый ответ, хотя, но я думаю, что нет универсального способа узнать это. – jasonline 28 February 2010 в 12:26

В зависимости от того, чего вы хотите достичь, Boost.Config может вам помочь. Он не обеспечивает обнаружение стандартной версии, но предоставляет макросы, которые позволяют вам проверять поддержку определенных функций языка / компилятора.

4
ответ дан Björn Pollex 28 August 2018 в 05:50
поделиться
  • 1
    В любом случае проверка функций - это, вероятно, лучшая идея, чем проверка стандартных версий. Немногие компиляторы поддерживают все со стандарта, но если все они поддерживают ограниченное количество функций, которые вам нужны, то не имеет значения, реализованы ли и реализованы ли все остальные функции из данного стандарта , – Rob Kennedy 24 February 2010 в 11:36

Из Bjarne Stroustrup C ++ 0x FAQ :

__cplusplus

В C ++ 0x макрос __cplusplus будет установлено значение, которое отличается от (больше) текущего 199711L.

Хотя это не так полезно, как хотелось бы. gcc (видимо, в течение почти 10 лет) это значение было установлено на 1, исключая один главный компилятор, до тех пор, пока он не был зафиксирован, когда gcc 4.7.0 вышел .

Это стандарты C ++ и какое значение вы должны ожидать в __cplusplus:

  • C ++ pre-C ++ 98: __cplusplus is 1.
  • C ++ 98: __cplusplus is 199711L.
  • C ++ 98 + TR1: Это читается как C ++ 98, и нет способа проверить, что я знаю.
  • C ++ 11: __cplusplus is 201103L.
  • C ++ 14: __cplusplus is 201402L.
  • C ++ 17 : __cplusplus is 201703L.

Если компилятор может быть старше gcc, нам нужно обратиться к специфическому хакерству компилятора (посмотрите на макрос версии, сравните его с таблица с реализованными функциями) или используйте Boost.Config (который предоставляет соответствующие макросы ). Преимущество этого в том, что мы действительно можем выбрать конкретные функции нового стандарта и написать обходное решение, если эта функция отсутствует. Это часто предпочтительнее для оптового решения, так как некоторые компиляторы будут требовать реализовать C ++ 11, но предлагают только набор функций.

В Stdcxx Wiki размещена всеобъемлющая матрица для поддержки компилятора из функций C ++ 0x (если вы решились проверить сами функции).

К сожалению, более мелкозернистая проверка функций (например, отдельные функции библиотеки, такие как std::copy_if) может выполняться в системе сборки вашего приложения (запустить код с помощью функции, проверить, скомпилирован ли он и получить правильные результаты - autoconf является инструментом выбора при прохождении этого маршрута).

161
ответ дан Bo Persson 28 August 2018 в 05:50
поделиться
  • 1
    Не похоже, что производители компиляторов обновляют это - возможно, они ждут, пока они полностью не соответствуют стандарту? ( stackoverflow.com/q/14131454/11698 ) – Richard Corden 22 January 2013 в 18:44
  • 2
    @RichardCorden clang уже определяет этот макрос, хотя поддержка C ++ 11 является частичной. – pmr 23 January 2013 в 13:19
  • 3
    @prnr: Это может быть правдой, но это зависит от пользователя, который задал вопрос, решить, какой ответ принять. В то время, когда ответ, который в настоящее время отмечен как принятый, был опубликован, это было правильно, поэтому первоначальный плакат принял его. Этот пользователь может решить изменить принятый ответ, но он больше не может быть активным на сайте. См. meta.stackexchange.com/questions/120568/… – Dan Korn 18 August 2016 в 19:26
  • 4
    Последняя версия Code :: Blocks IDE (v 16.01) с MinGW по состоянию на 12 августа 2017 года возвращает значение 201300 в качестве значения __cplusplus. – Gabriel Staples 12 August 2017 в 14:30
  • 5
    @AlMamun Microsoft частично исправлена ​​__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";
}
3
ответ дан Debmalya Biswas 28 August 2018 в 05:50
поделиться

После быстрого google :

__STDC__ и __STDC_VERSION__, см. здесь

3
ответ дан Tor Valamo 28 August 2018 в 05:50
поделиться
  • 1
    Определен ли __STDC__ и каково его значение, определены в C ++. – Rob Kennedy 24 February 2010 в 09:57
  • 2
    @Rob: Да, это так. @Tor: Я пробовал в VC ++ 2005, но он говорит, что STDC - необъявленный идентификатор. Однако он указан как один из этих заранее определенных макросов. Однако STDC_VERSION не существует. – jasonline 24 February 2010 в 10:04
  • 3
    Это говорит вам версию языка программирования C, поддерживаемого компилятором. Он ничего не говорит о версии поддерживаемого языка C ++. – Dan Moulding 8 May 2012 в 15:29
  • 4
    Этот ответ просто совершенно неправильный. – alecov 13 March 2013 в 23:26

__ cplusplus

В C ++ 0x макрос __cplusplus будет установлен в значение, которое отличается от (больше) текущего 199711L.

C ++ 0x FAQ by BS

3
ответ дан Vinzenz 28 August 2018 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: