我执行了我的项目的重构,我希望摆脱所有匿名命名空间,包括类,结构,联合。 我想用最简单的方式替换它们的命名等价物。 据我所知,匿名命名空间的等价物是:
这样的代码:
namespace { namespace-body }
相当于:
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
link:Anonymous Namespace Ambiguity
在这种简单的情况下,只需设置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 unique { /* empty body */ }
using namespace unique;
struct unique { namespace-body }
也不可能在struct中定义命名空间,因此在这个例子中不可能只替换“namespace”关键字上的“struct”。
那么,为“问题示例”设置匿名结构,联合,类的名称的最简单方法是什么?通常用于所有可能的示例?
答案 0 :(得分:2)
static
说明符一样。typedef struct { int a; void func() {}; } s1;
可以更好地替换为struct s1 { int a; void func() {} };
- 无需额外的“唯一”标识符。同样适用于工会。整个typedef struct { /*def*/ } Blah;
构造实际上是C残余,在C ++中不是必需的。对于您的实际问题示例:除了可能引入填充字节之外,内部结构没有太大影响。所以这应该是等同的并且完成工作:
//Problem example, revisited
struct vec3 {
class Bar {
public:
void foo();
};
Bar bar;
float x, y, z;
float xyz[3];
};