在我的项目中,我打开了将警告视为错误并使用 -pedantic
和 -ansi
标签进行编译。我正在使用 GCC 编译器。在这个项目中,我必须使用有很多警告的第三方源代码。由于我将警告视为错误,因此我很难修复他们的代码。
大多数警告都是关于从 int
到 size_t
的无效转换,反之亦然。在某些情况下,我无法将两个变量设为同一类型,我的意思是我无法将某些内容更改为 size_t
。在这种情况下,我会进行显式转换。类似的东西,
size_t a = (size_t) atoi(val);
我想知道这是正确的方法吗?这样做有什么问题吗?
如果这些警告很小,我可以只在他们的文件上禁止显示吗?我如何在 MSVC 上做同样的事情?
最佳答案
编辑:
如果您想以一种可移植的方式关闭每个实例的编译器,则强制转换是唯一的方法。只要您知道自己在做什么就可以了,例如您可以确保 atoi
的结果永远不会为负数。
在 GCC 中,您可以使用 -Wno-sign-conversion
标志关闭所有符号转换警告。还有 -Wno-sign-compare
(对于 2u > 1
之类的东西),但除非您使用 -Wextra
,否则它不会相关.
您还可以使用 diagnostic pragmas喜欢
#pragma GCC diagnostic ignored "-Wsign-conversion"
在 MSVC 中,有几个与有符号/无符号不匹配相关的警告,例如:
要在 MSVC 中禁用警告,您可以添加 #pragma warning
例如
#pragma warning (disable : 4267)
或者在编译器选项中添加一个/wd4267
标志。
也许你应该使用strtoul
而不是 atoi
。
size_t a = strtoul(val, NULL, 0);
(只有当 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;
}
关于从 ‘size_t’ 转换为 ‘int’ 可能会改变结果的符号 - GCC , C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3377137/