1

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を待つだけですか?

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

main.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 に答える