0

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

这样的代码:

namespace { namespace-body }

相当于:

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

链接:匿名命名空间歧义

在这种简单的情况下,只需为 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 。例如:

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

也不可能在 struct 中定义命名空间,因此在此示例中,不能仅在“namespace”关键字上替换“struct”。

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

4

1 回答 1

2
  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];
};
于 2013-02-28T13:44:18.857 回答