从 ‘size_t’ 转换为 ‘int’ 可能会改变结果的符号 - GCC , C

标签 c visual-c++ gcc warnings

在我的项目中,我打开了将警告视为错误并使用 -pedantic-ansi 标签进行编译。我正在使用 GCC 编译器。在这个项目中,我必须使用有很多警告的第三方源代码。由于我将警告视为错误,因此我很难修复他们的代码。

大多数警告都是关于从 intsize_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_tunsigned 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/

相关文章:

C 的代码 koans?

c - C 中的局部和外部变量命名约定

c++ - Visual-C++ 链接器错误

C++ DLL 不能在不同的机器上运行

gcc - 自动展开并输出C/C++代码

c - C:有人知道“C谜”代码是如何工作的吗?

c - AVL 树旋转。不同的可能性

visual-studio-2010 - Visual Studio "The referenced project ' {<IDENTITY> }' does not exist"

c++ - 如何使用 .h.gch 文件

gcc - 开始使用 GCC 插件