1

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

一个.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?

4

1 回答 1

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

主.cpp:

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

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

于 2012-07-07T00:39:18.437 回答