Edit:
如果您想以可移植的方式关闭每个实例的编译器,则强制转换是唯一的方法。只要您知道自己在做什么就可以了,例如你可以确保结果atoi
永远不会是负数。
在 GCC 中,您可以使用以下命令关闭所有符号转换警告-Wno-sign-conversion
旗帜。还有-Wno-sign-compare
(对于像这样的东西2u > 1
)但除非您使用,否则它不会相关-Wextra
.
您还可以使用诊断语用 like
#pragma GCC diagnostic ignored "-Wsign-conversion"
在 MSVC 中,有几个与有符号/无符号不匹配相关的警告,例如:
- Level 4:
- Level 3:
- Level 2:
要禁用 MSVC 中的警告,您可以添加#pragma warning e.g.
#pragma warning (disable : 4267)
或添加一个/wd4267
编译器选项中的标志。
也许你应该使用strtoul代替atoi
.
size_t a = strtoul(val, NULL, 0);
(没有任何警告only if size_t
与unsigned long
。在大多数平台上,这是正确的,但不能保证。)
优点是您可以使用此函数执行错误检查,例如
#include <stdlib.h>
#include <stdio.h>
int main () {
char val[256];
fgets(val, 256, stdin);
char* endptr;
size_t a = strtoul(val, &endptr, 0);
if (val == endptr) {
printf("Not a number\n");
} else {
printf("The value is %zu\n", a);
}
return 0;
}