首页 > 解决方案 > 与显示警告的 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

本身就很完整。我需要澄清我的疑问。

标签: c++

解决方案


假设您使用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_tsize_tis 无符号类型之一的返回类型,显示了这样的有线警告。

在我的机器上,我发现size_t定义stddef.h如下:

#define __SIZE_TYPE__ long unsigned int
typedef __SIZE_TYPE__ size_t;

您比较 anintunsigned intinfor语句,这就是为什么这里有这样的警告。


推荐阅读