Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

gcc 4.2と無名名前空間

タグ: C++ gcc
/// @file Hoge.h
#include <boost/scoped_ptr.hpp>

class Hoge
{
public:
    ~Hoge();
    
private:
    class Impl;
    boost::scoped_ptr<Impl> pimpl;
};
/// @file Hoge.cpp
#include "Hoge.h"

namespace {
struct Fuga {};
}

class Hoge::Impl
{
    Fuga fuga;
};

Hoge::~Hoge()
{
}

gcc 4.0向けに書いていた上記のコードをgcc 4.2.1でコンパイルしたところ、次のような警告を受けた。

Hoge.cpp:9: warning: ‘Hoge::Impl’ has a field ‘Hoge::Impl::fuga’ whose type uses the anonymous namespace

どうも「翻訳単位ローカルではないクラスが無名名前空間の構造体をメンバにしている」ことを注意しているようだが……マジか。
たしかに、「Fugaを含む無名名前空間」と「Hoge::Implの定義」が「複数の翻訳単位で参照される(つまりヘッダファイルに書かれている)」場合それは問題になる。
しかし、それを警戒するためにpimplと無名名前空間の蜜月の関係にまで茶々を入れるというのは、いささか大仰に過ぎるのではなかろうか。
そう思ってBugzillaを覗いてみると、案の定、この警告に関する問題が挙げられていた。

Bug 29365 - Unnecessary anonymous namespace warnings - GCC Bugzilla

すでにFIXEDとなっているので、「4.3系」と、あと「4.2.2以降(だと思う)」では対応がなされているらしい。
試しにgcc 4.3.3でビルドしてみたところ、たしかに上記のコードでは警告を受けなくなった。
ひとまず安心。

もっとも、開発環境の都合上、すぐさま新しいgccには移行できない。
この鬱陶しい警告とは、いましばらく付き合わなければならないようだ。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/187-414c4759
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。