0

プロジェクトのリファクタリングを実行し、クラス、構造体、共用体を含むすべての匿名名前空間を削除したいと考えています。最も簡単な方法で、名前付きの同等のものに置き換えたいと思います。私の知る限り、匿名名前空間に相当するものは次のとおりです。

そのようなコード:

namespace { namespace-body }

次と同等です。

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

リンク:匿名の名前空間のあいまいさ

このような簡単なケースでは、構造体、共用体、クラスに一意の名前を設定するだけで十分です。

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 }

構造体内で名前空間を定義することもできないため、この例の「名前空間」キーワードの「構造体」を単に置き換えることはできません。

では、匿名の構造体、共用体、クラスの名前を「問題の例」および一般的に考えられるすべての例に設定する最も簡単な方法は何ですか?

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 に答える