c++ - 与显示警告的 string.size() 比较时 int 的签名
问题描述
所以,我正在写下这段代码
void shortened(string s){
int cnt=0;
for(int i=0;i<s.size()-1;++i){
cnt++;
}
//some extra code
}
这个 for 循环向我显示了一个警告,即比较不同符号 int 和 string::size_type 的整数表达式。但是,一旦我将 int i = 0 更改为 unsigned int i=0 ,就没有任何警告。我知道字符串的长度永远不能为零,这就是显示警告的原因,因为 int i 也可以保存负数。但是为什么首先显示警告?
i-0;i<s.size()-1
本身就很完整。我需要澄清我的疑问。
解决方案
假设您使用g++
的是编译器。(我不熟悉gcc
时是一样的)clang
此警告来自编译选项,该选项-Wall
要求编译器为您提供所有内容的详细警告(Wall
= Warning All
)。(更多信息可以访问https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options)</p>
所以g++ -o tmp tmp.cpp
不会显示这样的警告,但g++ -o tmp -Wall tmp.cpp
会。
回到主题:由于string.size()
issize_t
和size_t
is 无符号类型之一的返回类型,显示了这样的有线警告。
在我的机器上,我发现size_t
定义stddef.h
如下:
#define __SIZE_TYPE__ long unsigned int
typedef __SIZE_TYPE__ size_t;
您比较 anint
和unsigned int
infor
语句,这就是为什么这里有这样的警告。
推荐阅读
- cuda - 将 cuda 倾斜内存复制到一维阵列(设备到设备)的推荐方法是什么?
- emacs - 如何在批处理模式下运行 emacs 并让它自动遵循 GIT 存储库链接
- c# - SignalR 消息未在 mvc 视图上接收
- proxy - 如何向 http 代理添加异常
- swift - Swift 5,无法显示此文本
- python - 如何在 Python、Sqlite3 中处理日期。日期存储为 vachar?
- jhipster - 来自 OAuth 提供者的用户数据不匹配
- wordpress - 如何在 Polylang 插件的特定页面中隐藏语言代码
- reactjs - Mapbox GL Js,动态改变地图容器大小,无法调整地图大小
- file - 编辑没有扩展名格式的文件(二进制 vs gbrish)