如何用命名的等价物替换未命名的struct,union,class?

时间:2013-02-28 13:28:34

标签: c++ anonymous-class anonymous-struct

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

这样的代码:

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中定义命名空间,因此在这个例子中不可能只替换“n​​amespace”关键字上的“struct”。

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

1 个答案:

答案 0 :(得分:2)

  1. 不,命名的命名空间与匿名命名空间不同。匿名命名空间的主要用途是使其所有内容都具有内部链接 - 这意味着其他编译单元不能引用它(例如调用函数)。因此重命名匿名名称空间。这就像从静态函数中删除static说明符一样。
  2. typedef struct { int a; void func() {}; } s1;可以更好地替换为struct s1 { int a; void func() {} }; - 无需额外的“唯一”标识符。同样适用于工会。整个typedef struct { /*def*/ } Blah;构造实际上是C残余,在C ++中不是必需的。
  3. 对于您的实际问题示例:除了可能引入填充字节之外,内部结构没有太大影响。所以这应该是等同的并且完成工作:

    //Problem example, revisited
    struct vec3 { 
    
      class Bar {
      public:
        void foo();
      };
    
      Bar bar;
      float x, y, z;
      float xyz[3];
    };