2

list_tプロジェクトで、のようなリストモジュールAPIを取得するように定義しましたlist_pop()。しかし、今はMySQL libを使用してDBと通信する必要がありますが、MySQL libは引き続きリストを実装し、list_pop()APIも定義しています。他のモジュールでは、両方をリンクする必要があり、競合が発生します。

私の解決策の1つは、さまざまなリストAPI呼び出し用のヘッダーファイルを個別にインクルードすることです。これはうまく機能しますが、一部の関数はとの両方を呼び出す必要がありますがMySQL::list_pop()local::list_pop()コンパイラに正しいリンクポイントを通知するにはどうすればよいですか?変更なしでこれらを実行できるGCCトリックはありますかlocal::list_pop()

4

2 に答える 2

3

ほとんどの実用的な目的のために、関数のいずれかのセットの名前を変更する必要があります。MySQL の名前を変更するよりも、独自の名前を変更する方がおそらく簡単です。

最も簡単な方法は、イニシャルやプロジェクトのコードネームなど、一意である可能性が高い (十分な) プレフィックスを追加することです。または、MySQL が将来新しい機能を追加する可能性があることに注意して、衝突を避けるためにすべての名前を変更することもできます。

これがまさに、名前空間が C++ 用に考案された理由であり、C プロジェクトが通常、関数のセットに体系的な接頭辞を持っている理由です。

于 2013-01-18T05:01:34.537 に答える
2

これを解決する方法があります。list_pop()をたとえばmy_list_pop()にリファクタリングします。

これを解決するもう1つの方法があります。

my_list.hここでMySQLのヘッダーを見ると、 https://github.com/lgsonic/mysql-trigger/blob/master/mysql/my_list.hlist_popこれは単なるマクロであり、コンパイル時にバインドされていることがわかります。ランタイム(したがって、実際のライブラリ関数ではありません)。list_popMySQLをlist_pop_my(ちょうど)に変更すると、MySQL#defineがやりたいことを実行できるようになります。

于 2013-01-18T05:07:33.840 に答える