c++ - 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]
};
我的问题是:
- 删除第 222 行的分号是否正确?有问题的代码:
default_random_engine& get_rand()
{
static default_random_engine ran;
return ran;
};
- 什么是可能的解决方法
unsigned expression < 0 is always false
? - 将来使用 g++ (mingw64) 应该注意什么?如果可能的话,有哪些资源可以学习如何有效地使用 g++ 编译器?
要编译的代码只是一个简单的hello world。谢谢
解决方案
1.
那个分号是多余的。它仅在类、结构、枚举或联合定义的右大括号 } 之后是强制性的。
2.
正如错误消息所说,一个unsigned
类型永远不能有负值,所以测试if (i<0)
是没有用的。编译器会发出警告,因为这种无用的测试表明代码中某处可能存在错误。你如何解决它很难说。要么比较是多余的,可以去掉;或者i
不应该是无符号类型并且需要更改。最后,这是一个设计选择。
3.
使用您当前的警告设置,您已经在广泛使用编译器提供的安全网。那挺好的。现在养成检查这些警告并修复它们的习惯。您的目标应该是完全没有警告的干净编译。尤其是在繁重的开发过程中,您不能总是做到这一点。但是,请尽可能缩短您确实有警告的时间。
为了避免愚蠢的错误,你需要使用的脑力越少,你为实现的逻辑留下的余地就越多。通过一些练习,可以非常快地进入“如果它编译它就可以工作”(大多数情况下)阶段。
在理解 GCC 时,我目前不会超出警告设置。无论如何,除了 hello world 示例之外,您不想直接调用 g++。对于更复杂的项目,您需要一个为您完成所有编排和配置的构建系统。在 C++ 世界中,这意味着 CMake。有效的现代 CMake是对当前实践的一个很好的概述。尤其是查看“入门”部分中的视频。
推荐阅读
- android - 在 Kotlin 的底部片段中添加子片段
- r - 如果语句必须采用这种格式,为什么要使用 R?
- python - 填写分类列的缺失值
- javascript - React Native:点击 ScrollView 组件内的子组件触发最后一项的 onPress 事件
- php - PHP Group Array 按函数对值的结果
- python - 在 Python 中创建具有多列的运行总计
- artificial-intelligence - 使用热图核心图像探索数据
- javascript - 如何在svg纹理threejs之上添加织物js纹理
- python - currentIndexChanged 和 currentTextChanged PyQt5 有什么区别
- entity-framework-core - 无法跟踪“Entity”类型的实体,因为其主键属性“Id”为空