Linux<ncurses.h>
ヘッダーは関数meta
を定義し、C++ メタプログラミング ライブラリmeta
はそのすべてのコードをグローバル名前空間に置きますmeta
。
同じ C++ プログラムで両方を使用するにはどうすればよいですか (必ずしも同じ TU である必要はありませんが、それは良いことです)。名前の衝突を回避する方法はありますか?
脆弱な回避策が 2 つありますが、簡単に壊れてしまいます。
回避策 A:
namespace linux { #include <ncurses.h> } // namespace linux using linux::max_align_t; // ncurses assumes it is in the global namespace #include <meta/meta.hpp>
ncurses
はコンパイルされますが、シンボルはグローバル名前空間にあると予想されるため、リンクに失敗する可能性があります。回避策 B:
#include <ncurses.h> namespace cpp { #include <meta/meta.hpp> } // namespace cpp
meta
ライブラリがそのシンボルのいずれかがグローバル名前空間にあると想定しない場合にのみ機能するため、非常に脆弱です。つまり、ライブラリがシンボルを内部的に明確にする必要があり、その::meta::symbol_name
ために使用する場合、このアプローチは機能しなくなります。