プロジェクトのリファクタリングを実行し、クラス、構造体、共用体を含むすべての匿名名前空間を削除したいと考えています。最も簡単な方法で、名前付きの同等のものに置き換えたいと思います。私の知る限り、匿名名前空間に相当するものは次のとおりです。
そのようなコード:
namespace { namespace-body }
次と同等です。
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
リンク:匿名の名前空間のあいまいさ
このような簡単なケースでは、構造体、共用体、クラスに一意の名前を設定するだけで十分です。
1) そのようなコード:
typedef struct { int a; void func() {}; } s1;
と同等です
typedef struct unique { int a; void func() {}; } s1;
2) そのようなコード:
struct vec3 {
struct {
class
{
public:
void foo();
} bar;
float x, y, z;
} hotel;
float xyz[3];
};
int main() {
vec3 v;
return 0;
}
次と同等です。
struct vec3 {
struct wigwam {
class skyscraper
{
public:
void foo();
} bar;
float x, y, z;
} hotel;
float xyz[3];
};
int main() {
vec3 v;
return 0;
}
しかし、そのような場合はどうすればよいですか、私にはわかりません:
//Problem example
struct vec3 {
struct {
class
{
public:
void foo();
} bar;
float x, y, z;
} ;
float xyz[3];
};
int main() {
vec3 v;
v.x = 10; //direct access to the internal variable of anonymous struct.
return 0;
}
ご覧のとおり、匿名の構造体が匿名の名前空間であるのと同じ方法で、匿名の構造体のメンバーにアクセスできます。しかし、同様の方法で struct を定義することはできません。例えば:
struct unique { /* empty body */ }
using namespace unique;
struct unique { namespace-body }
構造体内で名前空間を定義することもできないため、この例の「名前空間」キーワードの「構造体」を単に置き換えることはできません。
では、匿名の構造体、共用体、クラスの名前を「問題の例」および一般的に考えられるすべての例に設定する最も簡単な方法は何ですか?