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