C ++ g ++ -pedantic警告

时间:2020-05-03 06:54:10

标签: c++ header compile-time gcc-pedantic

我正在学习Bjarne Stroustrup的书“使用C ++编程原理和实践”。我从here下载了他的头文件,并在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 ++编译器?

要编译的代码只是一个简单的问候世界。 谢谢

1 个答案:

答案 0 :(得分:1)

1。

该分号是多余的。只有在类,结构,枚举或联合定义的右括号

2。

如错误消息所述,unsigned类型永远不能具有负值,因此测试if (i<0)是没有用的。编译器发出警告,因为这样的无用测试是代码中某处可能出现错误的指示。修复方法很难说。比较结果是多余的,可以删除;或i不应为无符号类型,需要进行更改。最后,这是一种设计选择。

3。

使用当前的警告设置,您已经在广泛使用编译器提供的安全网。那很好。现在,使其成为习惯来检查这些警告并进行修复。您的目标应该是没有任何警告的干净编译。特别是在繁重的开发过程中,您无法始终做到这一点。但请尽量使您发出警告的时间尽可能短。

为避免愚蠢的错误而需要的脑力投入越少,您为实施逻辑所付出的努力就越多。稍加练习,就可以很快进入“如果可以编译,就可以工作”的阶段(大部分时间)。

为了了解GCC,目前我不会超出警告设置。无论如何,您都不想直接调用g ++来访问世界。对于更复杂的项目,您需要一个构建系统来为您完成所有编排和配置。在C ++世界中,这意味着CMake。 Effective Modern CMake是当前做法的良好概述。尤其请看入门部分中的视频。