【发布时间】:2013-02-14 17:14:38
【问题描述】:
我对我的项目进行了重构,我想摆脱所有匿名命名空间,包括类、结构、联合。 我想用它们命名的等价物以最简单的方式替换它们。 据我所知,匿名命名空间的等价物是:
这样的代码:
namespace { namespace-body }
相当于:
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
链接:Anonymous Namespace Ambiguity
在这种简单的情况下,只为结构、联合、类设置唯一的名称就足够了:
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 }
在结构中定义命名空间也是不可能的,因此在这个例子中不能只用“命名空间”关键字替换“结构”。
那么,为“问题示例”以及所有可能的示例设置匿名结构、联合、类的名称的最简单方法是什么?
【问题讨论】:
-
为什么这是一个目标?匿名命名空间是有目的的;未命名的结构、类和联合也是如此。必须为不需要它们的事物编造不冲突的名称无助于消除确实需要它们的事物的名称冲突。
-
我真的不明白你想要实现的目标,如果你想改进代码,请停止制作匿名结构、命名空间、1 off 实例、typedef 结构符号等等。
-
给匿名命名空间一个唯一的名字,然后在没有冲突的地方合并(唯一命名的命名空间),如果需要的话。
-
Pete Becker,111111,当然我的问题看起来很荒谬。但是我的项目没有匿名命名空间是可以的。它们只是不必要的。
-
贾斯汀,你能详细解释一下吗?
标签: c++ anonymous-class anonymous-struct