我正在学习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]
};
我的问题是:
default_random_engine& get_rand()
{
static default_random_engine ran;
return ran;
};
unsigned expression < 0 is always false
的可能解决方法是什么?要编译的代码只是一个简单的问候世界。 谢谢
答案 0 :(得分:1)
1。
该分号是多余的。只有在类,结构,枚举或联合定义的右括号}之后才强制使用。
2。
如错误消息所述,unsigned
类型永远不能具有负值,因此测试if (i<0)
是没有用的。编译器发出警告,因为这样的无用测试是代码中某处可能出现错误的指示。修复方法很难说。比较结果是多余的,可以删除;或i
不应为无符号类型,需要进行更改。最后,这是一种设计选择。
3。
使用当前的警告设置,您已经在广泛使用编译器提供的安全网。那很好。现在,使其成为习惯来检查这些警告并进行修复。您的目标应该是没有任何警告的干净编译。特别是在繁重的开发过程中,您无法始终做到这一点。但请尽量使您发出警告的时间尽可能短。
为避免愚蠢的错误而需要的脑力投入越少,您为实施逻辑所付出的努力就越多。稍加练习,就可以很快进入“如果可以编译,就可以工作”的阶段(大部分时间)。
为了了解GCC,目前我不会超出警告设置。无论如何,您都不想直接调用g ++来访问世界。对于更复杂的项目,您需要一个构建系统来为您完成所有编排和配置。在C ++世界中,这意味着CMake。 Effective Modern CMake是当前做法的良好概述。尤其请看入门部分中的视频。