我对我的项目进行了重构,我想摆脱所有匿名命名空间,包括类、结构、联合。我想以最简单的方式用它们命名的等价物替换它们。据我所知,匿名命名空间的等价物是:
这样的代码:
namespace { namespace-body }
相当于:
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
链接:匿名命名空间歧义
在这种简单的情况下,只需为 struct、union、class 设置唯一名称就足够了:
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 }
也不可能在 struct 中定义命名空间,因此在此示例中,不能仅在“namespace”关键字上替换“struct”。
那么,为“问题示例”以及所有可能的示例设置匿名结构、联合、类的名称的最简单方法是什么?