我正在尝试使用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?
答案 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_宏包装起来以保持一致性。