草庐IT

compiler-warnings

全部标签

c++ - 是否有任何 C++ 编译器可以对悬空引用发出警告?

给定以下代码,其中x是对已消失对象的悬空const引用,因此是未定义的行为。autoget_vec(){returnstd::vector{1,2,3,4,5};}constauto&x=get_vec().back();似乎GCC7.3、Clang6.0和MSVC都无法发出警告,即使启用了所有警告。有谁知道在这些情况下是否可以发出警告?在这些情况下,constauto&和auto&&之间有什么区别吗?请注意,如果back()将按值返回,则它不会是未定义行为,因为生命周期临时对象x已扩展为函数scoop。长话短说:我有一个代码库,其中constauto&被用作初始化变量的默认方式,出于

c++ - 比较整数和字符串没有编译错误?

可能和很多人一样,我打错了字inta=0;cout但是,MSVC++编译器只抛出一个警告warningC4552:'尽管我预计会出现编译错误。它确实是标准的投诉代码吗?是否发生任何使代码有效的隐式类型转换或重载?我也很困惑是否运算符正在比较字符串""用一个整数a或结果为cout相关的SO帖子是here. 最佳答案 运算符的优先级高于,所以这被解析为(cout您实际上并不是在比较字符串和整数。相反,您正在比较ostream::operator的返回值,即std::cout本身,到字符串文字。这也不合法(从某种意义上说,它具有未指定的结

C++ "value++"会导致警告但 "value+1"不会?

这个问题在这里已经有了答案:Undefinedbehaviorandsequencepoints(5个答案)关闭3年前。代码:inta=0;a=++a%5;引起警告:warning:operationon'a'maybeundefined[-Wsequence-point]a=++a%5;~~^~~~~~~~~用-Wall编译时用各种编译器比如gcc然而这段代码,工作正常吗?inta=0;a=(a+1)%5;为什么这是一个警告,可以安全地忽略它吗?将其包裹在方括号中似乎并不能使警告消失。编辑:为澄清起见,我在看到这些警告消息时使用的是C++17编译器。

C++ 单例用法 : compiler complains about private constructor

我知道有一百万个关于单例的问题和答案,但我似乎无法找到解决方案。所以冒着反对票的风险,这是我的问题:我想使用AndreiAlexandrescu的现代C++设计中的单例实现:标题:classSingleton{staticSingleton&Instance();private:Singleton(){};Singleton(constSingleton&){};Singleton&operator=(constSingleton&){};~Singleton(){};};实现:#include"s.hh"Singleton&Singleton::Instance(){staticSi

c++ - 试图仅在 g++ 的宏中使 -Waggregate-return 保持沉默 - 错误的编译器?

使用g++并使用-Waggregate-return编译#defineDOCTEST_CHECK(expr)\do{\_Pragma("GCCdiagnosticpush");\_Pragma("GCCdiagnosticignored\"-Waggregate-return\"");\if(Resultfailed=(ExpressionDecomposer()但是手动展开的版本不会产生任何警告:do{_Pragma("GCCdiagnosticpush");_Pragma("GCCdiagnosticignored\"-Waggregate-return\"");if(Result

c++ - 警告 : #warning qopenglfunctions. h 与 GLEW 不兼容,GLEW 定义将未定义 [-Wcpp]

我正在配置一个与glut一起工作的程序来与Qt一起工作。我正在使用Qt5.1.1。并且似乎从Qt4到Qt5已经丢失了一些openGL功能。在我的程序中,我创建了一个QOpenGLContext并尝试使用vbo渲染到QWindow。vbo部分工作正常。程序的其他一些部分依赖于glew。我在运行程序时收到以下警告#warningqopenglfunctions.hisnotcompatiblewithGLEW,GLEWdefineswillbeundefined[-Wcpp]#warningTouseGLEWwithQt,donotincludeorafterglew.h[-Wcpp]屏幕

c++ - 为什么 "cc1plus: warning: unrecognized command line option"选项的 "no-"仅在出现另一个警告时由 g++ 标记?

>catwarning.cpp#pragmafoobar>catno_warning.cpp#pragmamessage"foobar">g++-Wall-Wno-foobar-cwarning.cppwarning.cpp:1:0:warning:ignoring#pragmafoobar[-Wunknown-pragmas]cc1plus:warning:unrecognizedcommandlineoption"-Wno-foobar"[enabledbydefault]>g++-Wall-Wno-foobar-cno_warning.cppno_warning.cpp:1:17

c++ - -Wundef 不会被 g++ 中的 pragma 忽略

给定以下代码:#ifMACRO_WITHOUT_A_VALUEintvar;#endifintmain(){}编译时,g++-std=c++1z-Wundef-omainmain.cpp,它会产生以下警告:main.cpp:1:5:warning:"MACRO_WITHOUT_A_VALUE"isnotdefined[-Wundef]#ifMACRO_WITHOUT_A_VALUE^我想保持启用警告标志,但抑制这个特定实例。我应用以下内容:#ifdef__GNUC__#pragmaGCCdiagnosticignored"-Wundef"#pragmaGCCdiagnosticpush

c++ - Xcode 为 c++ 中的显式死代码提供了奇怪的解决方案?

Hashiwokakero,我正在编写一个程序来解决类似数独的谜题。我有一些看起来像这样的代码:if(bridgesLeft[row][col]==1){doSomething();}elseif(bridgesLeft[row][col]==2){doSomethingElse();}elseif(bridgesLeft[row][col]==3){doAnotherThing();}...我意识到我在doSomethingElse()函数中放置了一个错误,所以我没有删除那个block,而是添加了elseif(bridgesLeft[row][col]==2&&false)以保证错误

c++ - 通过提高新 C++ 代码的警告级别来强制构建的好方法

我继承了多个Windows应用程序的大型C++代码库,这些应用程序已被许多客户成功使用。代码库很大,>1millLOC。代码库已有15年以上的历史。代码库在某些领域以C编程风格和/或不是很现代的C++风格为主,例如不使用标准C++集合和算法。不幸的是,代码库仅以警告级别2(VisualC++中的/W2)编译。我想提高到3级(/W3)以提高安全性并为64位做好准备。将警告级别提高到3的最大问题是收到的许多警告涉及有符号/无符号不匹配,我认识到解决现有代码库的所有这些问题将是一项非常艰巨的任务。什么是确保和强制执行提交到代码库的新代码在编译时增加警告级别的好方法?用更一般的术语来说,这个问