C++ g++ -迂腐警告
C++ g++ -pedantic warning
我正在研究 Bjarne Stroustrup 的书 'Programming Principles and Practice Using 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]
};
我的问题是:
- 去掉第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.
那个分号是多余的。它仅在 class、结构、枚举或联合定义的右大括号 } 之后是强制性的。
2.
正如错误消息所说,unsigned
类型永远不会有负值,因此测试 if (i<0)
是无用的。编译器会发出警告,因为这种无用的测试表明代码中某处可能存在错误。你如何修复它很难说。要么比较是多余的,可以去掉;或 i
不应该是无符号类型,需要更改。最后,这是一个设计选择。
3.
根据您当前的警告设置,您已经广泛使用了编译器提供的安全网。那挺好的。现在养成检查这些警告并修复它们的习惯。您的目标应该是完全没有警告的干净编译。尤其是在繁重的开发过程中,你不可能总是做到这一点。但是请尽可能缩短 收到警告的时间。
您为避免愚蠢的错误而需要使用的脑力越少,您留给要实现的逻辑的脑力就越多。通过一些练习,可以非常快地进入“如果编译成功”(大部分时间)阶段。
在理解 GCC 时,我目前不会超出警告设置。无论如何,除了 hello world 示例之外,您不想直接调用 g++。对于更复杂的项目,您需要一个构建系统来为您完成所有的编排和配置。在 C++ 世界中,这意味着 CMake。 Effective Modern CMake 是对当前实践的一个很好的概述。尤其要看看 入门 部分中的视频。
我正在研究 Bjarne Stroustrup 的书 'Programming Principles and Practice Using 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]
};
我的问题是:
- 去掉第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.
那个分号是多余的。它仅在 class、结构、枚举或联合定义的右大括号 } 之后是强制性的。
2.
正如错误消息所说,unsigned
类型永远不会有负值,因此测试 if (i<0)
是无用的。编译器会发出警告,因为这种无用的测试表明代码中某处可能存在错误。你如何修复它很难说。要么比较是多余的,可以去掉;或 i
不应该是无符号类型,需要更改。最后,这是一个设计选择。
3.
根据您当前的警告设置,您已经广泛使用了编译器提供的安全网。那挺好的。现在养成检查这些警告并修复它们的习惯。您的目标应该是完全没有警告的干净编译。尤其是在繁重的开发过程中,你不可能总是做到这一点。但是请尽可能缩短 收到警告的时间。
您为避免愚蠢的错误而需要使用的脑力越少,您留给要实现的逻辑的脑力就越多。通过一些练习,可以非常快地进入“如果编译成功”(大部分时间)阶段。
在理解 GCC 时,我目前不会超出警告设置。无论如何,除了 hello world 示例之外,您不想直接调用 g++。对于更复杂的项目,您需要一个构建系统来为您完成所有的编排和配置。在 C++ 世界中,这意味着 CMake。 Effective Modern CMake 是对当前实践的一个很好的概述。尤其要看看 入门 部分中的视频。