【问题标题】:C++ Syntax Header File ErrorsC++ 语法头文件错误
【发布时间】:2020-04-27 17:04:51
【问题描述】:

我在 Visual Studio 2019 社区版中使用 opencv 和 gdal,我编写了一些示例测试以了解 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      

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

【问题讨论】:

  • 那些是警告不是 错误;很大的不同(尽管您可能想摆脱这些)。
  • 好的,我再发一个问题。@Adrian Mole

标签: c++ visual-studio opencv syntax-error header-files


【解决方案1】:

这些警告主要是告诉你该做什么,在哪里做。

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

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

【讨论】:

    【解决方案2】:

    正如其他人所指出的,这些是警告,而不是错误 - 您的代码编译并运行。您可以通过键入(例如“搜索”字段中的“C26451”;或者,您也可以使用 Google 搜索。

    对于C26812 警告,在堆栈溢出here 上讨论了无范围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>
    //...
    

    【讨论】:

    • 那么,这些警告只是在 MSVC 编译器中引发,而不是在 GCC 或 Clang 等其他编译器中引发?
    • 我不能代表GCC,因为我不使用它,但clang 可以如果你启用它们会给出类似的警告:可能使用@987654331 @ 切换命令行(或类似的东西)。
    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 2016-07-07
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多