2017-10-13 6 views
1

私はC++テストファイルの束を持ったプロジェクトを持っています。その上同じ名前の2つのC++クラスを分離する方法は?

// test1.cpp 
... 
class Foo { void bar() {...} }; 
... 

// test2.cpp 
... 
class Foo { void bar() {...} }; 
... 

と:各テストファイルは、このようなクラスを宣言します。

テストスイートがかなり大きくなり、一部のテストモジュールでFooクラスの内容が異なるようになるまではすべて問題ありませんでした。リンケージに関しては、状況が間違っています。各ELFファイルのクラスのメソッドはpublic weak(nm表記では "W")として宣言され、メソッドの間違ったインスタンスを呼び出す結果になります。 tests1.cppFoo::bar()tests2.cppから呼び出します。

class Fooのインスタンスを別のインスタンスから隔離するにはどうすればよいですか。

__attributes__ ((visibility ("hidden")))でクラスを宣言しても、記号は公開されたままです。

また、このために名前空間を使用することもできますが、このオプションは避けたいと考えています。

アイデア?

+5

なぜ名前空間を避けたいですか?彼らが発明された理由はかなりです! – Steve

+3

あなたは 'namespace {class Foo {...};}で' Foo'宣言をラップして匿名の名前空間を使うことができます。 } 'は同じように動作し、' Foo'をコンパイル単位の内部にします。 – rodrigo

+0

@ Steve私は名前空間の新しい名前をつくるのではなく、一度(例えばメイクファイルで)修正したいと思います。 – krokoziabla

答えて

7

あなたが任意の名前を属性に付けることを望まない限り、あなたがネームスペースを持っている疑いはありません。

匿名名前空間の場合は、これが完璧な仕事です。書き込み

namespace /*no name here makes it anonymous*/{ 
    class Foo { void bar() {...} }; 
} 

などです。これを行うと、その特定の翻訳単位にFooが内部化されます。

+0

匿名の名前空間を使用すると問題が解決します。私はGTestのテストを1つに入れることができないことを恐れていました。しかし、私はできるようです...だから、私はあなたに感謝すべきです。しかし、...それはソースではなく、コンパイラの側でそれを修正する方法はありますか? – krokoziabla

+0

@krokoziabla:これを行う際の私の留保は、ソースファイルが直接コンパイル可能でなくなることです。私はあなたの場合、余分なテキストに苦しんでいます。 – Bathsheba

+0

@krokoziabla - ハンマーを使ってスクリューを駆動する方法を考え出すことができますが、スクリュードライバーを使うほうがはるかに良いでしょう。 –

関連する問題