首页 > 解决方案 > C++ g++ - 迂腐警告

问题描述

我正在学习 Bjarne Stroustrup 的书“使用 C++ 编程原理和实践”。我从这里下载了他的头文件,并在 Windows 上的 VSCode 中使用了以下编译命令:

g++ -Wall -Wextra -Wconversion -pedantic -std=c++17 -g -c main.c

编译器抛出了一堆错误:

std_lib_facilities.h: In member function 'char& String::operator[](unsigned int)':
std_lib_facilities.h:114:8: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
   if (i<0||size()<=i) throw Range_error(i);
       ~^~
std_lib_facilities.h: In member function 'const char& String::operator[](unsigned int) const':
std_lib_facilities.h:120:8: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
   if (i<0||size()<=i) throw Range_error(i);
       ~^~
std_lib_facilities.h: At global scope:
std_lib_facilities.h:222:2: warning: extra ';' [-Wpedantic]
 };

我的问题是:

  1. 删除第 222 行的分号是否正确?有问题的代码:
default_random_engine& get_rand()
{
    static default_random_engine ran;
    return ran;
};
  1. 什么是可能的解决方法unsigned expression < 0 is always false
  2. 将来使用 g++ (mingw64) 应该注意什么?如果可能的话,有哪些资源可以学习如何有效地使用 g++ 编译器?

要编译的代码只是一个简单的hello world。谢谢

标签: c++headercompile-timegcc-pedantic

解决方案


1.

那个分号是多余的。它仅在类、结构、枚举或联合定义的右大括号 } 之后是强制性的。

2.

正如错误消息所说,一个unsigned类型永远不能有负值,所以测试if (i<0)是没有用的。编译器会发出警告,因为这种无用的测试表明代码中某处可能存在错误。你如何解决它很难说。要么比较是多余的,可以去掉;或者i不应该是无符号类型并且需要更改。最后,这是一个设计选择。

3.

使用您当前的警告设置,您已经在广泛使用编译器提供的安全网。那挺好的。现在养成检查这些警告并修复它们的习惯。您的目标应该是完全没有警告的干净编译。尤其是在繁重的开发过程中,您不能总是做到这一点。但是,请尽可能缩短您确实有警告的时间。

为了避免愚蠢的错误,你需要使用的脑力越少,你为实现的逻辑留下的余地就越多。通过一些练习,可以非常快地进入“如果它编译它就可以工作”(大多数情况下)阶段。

在理解 GCC 时,我目前不会超出警告设置。无论如何,除了 hello world 示例之外,您不想直接调用 g++。对于更复杂的项目,您需要一个为您完成所有编排和配置的构建系统。在 C++ 世界中,这意味着 CMake。有效的现代 CMake是对当前实践的一个很好的概述。尤其是查看“入门”部分中的视频。


推荐阅读