Ошибки файла заголовка синтаксиса C ++ - PullRequest
0 голосов
/ 10 января 2020

Я использую opencv и gdal с версией сообщества visual studio 2019, я пишу пример теста, чтобы узнать, нормально ли работают opencv и gdal на моем компьютере, но затем возникает какая-то ошибка с файлом заголовка, все эти ошибки не влияют на Компиляция программы и запуск или вывод программы - все в порядке, кроме синтаксической ошибки в заголовочном файле, что меня очень смущает. мой код ниже:

/*opencv_test*/
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat image = Mat::zeros(300, 600, CV_8UC3);
    circle(image, Point(250, 150), 100, Scalar(0, 255, 128), -100);
    circle(image, Point(350, 150), 100, Scalar(255, 255, 255), -100);
    imshow("Display Window", image);
    waitKey(0);
    return 0;
}

список ошибок выглядит следующим образом:

Warning C26451  Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2). opencv_test C:\MSVC_Library\OpenCV\opencv\build\include\opencv2\core    C:\MSVC_Library\OpenCV\opencv\build\include\opencv2\core\mat.inl.hpp    550 

Warning C6294   Ill-defined for-loop:  initial condition does not satisfy test.  Loop body not executed.    opencv_test C:\MSVC_Library\OpenCV\opencv\build\include\opencv2\core    C:\MSVC_Library\OpenCV\opencv\build\include\opencv2\core\matx.hpp   553 

Warning C26812  The enum type 'cv::AccessFlag' is unscoped. Prefer 'enum class' over 'enum' (Enum.3).   opencv_test C:\MSVC_Library\OpenCV\opencv\build\include\opencv2\core    C:\MSVC_Library\OpenCV\opencv\build\include\opencv2\core\mat.hpp    66      

Я надеюсь, что кто-то может ответить на мой вопрос, искренне.

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Как уже отмечали другие, это предупреждения , а не ошибки - и ваш код будет компилироваться и запускаться. Вы можете получить информацию о том, что означают эти предупреждения, из встроенной Visual Studio «Справка» (если она установлена), набрав, например, «C26451» в поле «поиск»; В качестве альтернативы вы можете использовать Google для того же.

Для предупреждения C26812, использование типов с незаданной областью enum обсуждается при переполнении стека, здесь ; но попытка «исправить» это путем изменения заголовков OpenCV с большой вероятностью вызовет у вас гораздо больше проблем! Я хотел бы предложить, чтобы все три предупреждения здесь можно было безопасно игнорировать, так как они скорее говорят о хорошем «стиле» кодирования, чем об указании возможных ошибок (работая в предположении, что люди, написавшие пакет OpenCV , делают знают, что они делают).

Однако, поскольку вы, скорее всего, не хотите изменить код в заголовках OpenCV, вместо этого вы можете временно перед включением отключите предупреждения, а затем восстановите их после всех соответствующих операторов #include.

В вашем случае для приведенных вами предупреждений это должно работать:

#ifdef _MSC_VER // These #pragma lines are MSVC-specific!
#pragma warning(disable:26451)  //
#pragma warning(disable:6294)   // Disable specified warning numbers
#pragma warning(disable:26812)  //
#endif // _MSC_VER

/*opencv_test*/
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>

#ifdef _MSC_VER
#pragma warning(default:26451)  //
#pragma warning(default:6294)   // 'Default' will reset to your project's settings
#pragma warning(default:26812)  //
#endif // _MSC_VER

#include <iostream>
//...
2 голосов
/ 10 января 2020

Во многом эти предупреждения говорят вам точно, что и где делать.

Причина, по которой программа работает нормально, заключается в том, что они не являются ошибками - предупреждение и ошибка - это очень разные вещи, с первым, как правило, допускающим компиляцию и ошибкой, означающей, что программа не будет компилироваться. Вы должны стараться как можно больше исправлять предупреждения, поскольку это может привести к неожиданным результатам в вашей программе.

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

...