【问题标题】:How to replace the unnamed struct, union, class by their named equivalents?如何用它们的命名等价物替换未命名的结构、联合、类?
【发布时间】: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


【解决方案1】:
  1. 不,命名命名空间与匿名命名空间不同。匿名命名空间的主要用途是让它们的所有内容都有内部链接——这意味着其他编译单元不能引用它(例如调用函数)。因此不要重命名匿名命名空间。这就像从静态函数中删除 static 说明符一样。
  2. 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];
};

【讨论】:

  • 非常感谢!这正是我需要的! :)
  • 请记住不要盲目更改不需要更改的代码。如果它按原样工作,请保持原样。如果您必须使用它(即更改它),请对其进行测试并重构它。但是要深思熟虑,不要只是对遇到的任何未命名的事物命名。
猜你喜欢
  • 2019-06-01
  • 1970-01-01
  • 2021-03-21
  • 2018-07-11
  • 2013-04-07
  • 2022-01-06
  • 1970-01-01
  • 2012-11-02
  • 2011-11-26
相关资源
最近更新 更多