gpt4 book ai didi

c++ - 如何用命名的等价物替换未命名的结构、 union 、类?

转载 作者:行者123 更新时间:2023-11-28 03:22:08 37 4
gpt4 key购买 nike

我对我的项目进行了重构,我想摆脱所有匿名命名空间,包括类、结构、 union 。我想以最简单的方式用它们的命名等价物替换它们。据我所知,匿名命名空间的等价物是:

这样的代码:

namespace { namespace-body }

相当于:

  namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }

链接:Anonymous Namespace Ambiguity

在这种简单的情况下,只为结构、 union 、类设置唯一名称就足够了:

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 }

在结构中定义命名空间也是不可能的,因此在这个例子中不可能仅仅替换“namespace”关键字上的“struct”。

那么,为“问题示例”以及通常为所有可能的示例设置匿名结构、 union 、类名称的最简单方法是什么?

最佳答案

  1. 不,命名空间与匿名空间不同。匿名命名空间的主要用途是让它们的所有内容都具有内部链接——这意味着其他编译单元不能引用它(例如调用函数)。因此,不要重命名匿名命名空间。这就像从静态函数中删除 static 说明符。
  2. typedef struct { int a;空函数(){}; } s1; 可以更好地替换为 struct s1 { int a; void func() {} }; - 不需要额外的“唯一”标识符。同样适用于 union 。整个 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];
};

关于c++ - 如何用命名的等价物替换未命名的结构、 union 、类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15136798/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com