gpt4 book ai didi

linux - GCC 警告 FD_SET 调用上的符号转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:53 25 4
gpt4 key购买 nike

我正在尝试使用 GCC 和 glibc 2.15 在 Ubuntu 12.04 上编译网络应用程序让我们以下面的代码为例:

a.cpp:

#include <sys/select.h>
void func ()
{
int fd;
fd_set fds;
FD_SET(fd, &fds);
}

我可以使用命令“gcc -c -Wsign-conversion a.cpp”成功编译这些行,但是在添加 -O1 或 -O2 选项后我收到以下警告:

gcc -c -O1 -Wsign-conversion a.cpp
a.cpp:6: warning: conversion to ‘long unsigned int’ from ‘int’ may change the sign of the result [-Wsign-conversion]

我收到了 gcc 4.4、4.5 和 4.6 的警告。

UPD:如果我理解正确,我的示例严格符合 FD_SET 语义,所以在这种情况下我应该没有警告。

这是什么原因?我该如何避免?

谢谢。

UPD:看起来这是现在的已知问题 - http://comments.gmane.org/gmane.comp.lib.glibc.alpha/22344 .但是我不明白我应该在 GLIBC 2.15 上用它做什么?只是等待下一个 GLIBC?

最佳答案

为了解决这个问题,我使用了一个单独的包装器源文件,并仅针对该源文件禁用了警告。

CMacroWrapper.h:

#include <sys/select.h>
namespace CMacroWrapper
{
void FdSet(int fd, fd_set *set);
}

CMacroWrapper.cpp:

#include "CMacroWrapper.h"

#pragma GCC diagnostic ignored "-Wsign-conversion"

void CMacroWrapper::FdSet(int fd, fd_set *set)
{
FD_SET(fd, set);
}

主要.cpp:

#include "CMacroWrapper.h"
void func ()
{
int fd;
fd_set fds;
FD_ZERO(&fds);
CMacroWrapper::FdSet(fd, &fds);
}

我发现 CMacroWrapper 命名空间对于添加在编译器警告中弹出的任何新系统 header 宏很有用。它确实添加了一个额外的函数调用,但为了警告安心,这是值得的。或者,如果您愿意,您可以包装所有 FD_ 宏以保持一致性。

关于linux - GCC 警告 FD_SET 调用上的符号转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10960569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com