GCC警告FD_SET呼叫上的符号转换

时间:2012-06-09 11:22:45

标签: linux gcc network-programming warnings

我正在尝试使用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?

1 个答案:

答案 0 :(得分:1)

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

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);
}

main.cpp中:

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

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