Установка C ++ opencv Ошибка Windows [дубликат]

12
задан Greg Hewgill 27 May 2015 в 03:48
поделиться

3 ответа

Вероятно, что некоторые заголовки определены __STDC_LIMIT_MACROS и __STDC_CONSTANT_MACROS до stdint.h.

Компиляция в Linux с g++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp должна исправить эту проблему на старых компиляторах.

Если вы хотите узнать больше об этих макросах ...

9
ответ дан Community 16 August 2018 в 00:19
поделиться
  • 1
    Да, это сработало! По крайней мере, в моей системе для тестовой программы. Я собираюсь попробовать его с реальной программой на Travis-CI. – Greg Hewgill 27 May 2015 в 03:59
  • 2
    Это действительно работало. Я добавил #define __STDC_LIMIT_MACROS перед первым включением в исходный файл проблемы, а затем скомпилирован. – Greg Hewgill 27 May 2015 в 04:09

Какой стандартный заголовок C ++ определяет SIZE_MAX?

Предполагается, что он определен в <cstdint>, но его необязательный.

Вот результаты по Fedora 22 с GCC 5.1:

#include <cstdint>

// use SIZE_MAX

Результаты в:

g++ -DNDEBUG -g -O2 -fPIC -march=native -pipe -c filters.cpp
In file included from /usr/include/c++/5.1.1/cstdint:35:0,
                 from filters.cpp:14:
/usr/include/c++/5.1.1/bits/c++0x_warning.h:32:2: error: #error This file requires  
compiler and library support for the ISO C++ 2011 standard. This support is currently
experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^
filters.cpp: In constructor ‘Filter::Filter(BufferedTransformation*)’:
filters.cpp:305:36: error: ‘SIZE_MAX’ was not declared in this scope
  : Filter(attachment), m_firstSize(SIZE_MAX), m_blockSize(0), m_lastSize(SIZE_M
                                    ^

Было просто проще сделать следующее и перестать беспокоиться о непереносной необязательности, которая все еще вызывает проблемы в 2015 году.

#include <limits>

#ifndef SIZE_MAX
# ifdef __SIZE_MAX__
#  define SIZE_MAX __SIZE_MAX__
# else
#  define SIZE_MAX std::numeric_limits<size_t>::max()
# endif
#endif

Попытка __SIZE_MAX__ возвращает вас к постоянной времени компиляции, которую вы, вероятно, жаждете. Вы можете увидеть, если он определен в препроцессоре с cpp -dM < /dev/null | grep __SIZE_MAX__.

(И как / почему numeric_limits<size_t>::max() является not , константа времени компиляции является еще одной загадкой C ++, но это другая проблема).

2
ответ дан jww 16 August 2018 в 00:19
поделиться
  • 1
    "numeric_limits<size_t>::max() не является постоянной времени компиляции" - с каким стандартом? ru.cppreference.com/w/cpp/types/numeric_limits/max говорит, что это constexpr с C ++ 11 (спасибо за подсказку для пользователя 1913600 - romain-b). – osgx 1 August 2017 в 23:36

18.4.1 Header & lt; cstdint> synopsis

Заголовок также определяет многочисленные макросы формы:

INT_ [FAST LEAST] {8 16 32 64} _MIN

[U] INT_ [FAST LEAST] {8 16 32 64} _MAX

INT {MAX PTR} _MIN

[U] INT {MAX PTR} _MAX

{PTRDIFF SIG_ATOMIC WCHAR WINT} {_ MAX _MIN}

SIZE_MAX

EDIT

В текущем стандарте C ++ 11/14 SIZE_MAX вводится и упоминается только в <cstdint>. Он также является частью C99, из которых спецификация C ++ 11 полностью включает в себя заголовки <cxxx>. Так кажется, что он не был определен до C ++ 11.

7
ответ дан vsoftco 16 August 2018 в 00:19
поделиться
  • 1
    @GregHewgill, к сожалению, у меня нет копии стандарта C ++ 98/03. Я даже не уверен, что это было определено раньше. Я думаю, что он определен стандартом C99, а afaik, C ++ 11 полностью включает спецификации C99. – vsoftco 27 May 2015 в 03:46
  • 2
    @vsoftco: C ++ 2003 не включал cstdint и поэтому не включал SIZE_MAX. – Bill Lynch 27 May 2015 в 03:46
  • 3
    @BillLynch да, это то, что я в основном говорил, что он, кажется, недавно появился на C ++ 11 (хотя он был частью C99 раньше). – vsoftco 27 May 2015 в 03:48
  • 4
    C ++ 03 не использовал C99 в качестве нормативной ссылки. – Shafik Yaghmour 27 May 2015 в 03:49
  • 5
    @ShafikYaghmour спасибо, я отредактировал ответ, я знал также, что C ++ 11 была первой версией, полностью включающей C99. – vsoftco 27 May 2015 в 03:51
Другие вопросы по тегам:

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