C++ 语法头文件错误

C++ Syntax Header File Errors

我将 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      

希望有人能真诚地回答我的问题。

这些警告主要是告诉您要做什么以及在哪里做。

程序运行良好的原因是因为它们不是错误 - 警告和错误是截然不同的东西,前者通常允许编译,而错误意味着程序将无法编译。您应该尽可能多地修复警告,因为它可能会导致您的程序出现意外结果。

如果您无法实施这些建议,若要获得有关如何修复警告的进一步帮助,则您必须提供它突出显示的代码。

正如其他人指出的那样,这些是 警告 ,而不是 错误 - 您的代码 编译和 运行。您可以从 in-built、Visual Studio "Help"(如果您已安装)中获取有关这些警告含义的信息,方法是键入,例如"C26451" 在 "search" 字段中;或者,您可以 Google 相同。

对于 C26812 警告,Stack Overflow 上讨论了无范围 enum 类型的使用,here;但是尝试通过修改 OpenCV header(s) 来 'fix' 这很可能会给您带来更多问题!我建议在这里可以安全地忽略所有三个警告,因为它们同样是关于建议好的编码 "style" 而不是指出可能的错误(假设编写 OpenCV 包的人知道他们在做什么)。

但是,由于您很可能 不想 修改 OpenCV header 中的代码,您可以暂时禁用包括它们之前的警告,然后在所有相关 #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>
//...