1

したがって、次のC++ヘッダーがあるとしますtestheader.h

struct mystruct
{
  struct myinnerstruct
  {
        int x;
  } astruct;
};

struct myinnerstruct
{
    int x;
};

および次のC++ソースtest.cpp

#include "testheader.h"
using namespace std;
int main()
{
    return 0;
}

g ++は、コンパイル/リンク中に問題を発生させません。

さて、同じヘッダーを持っているが、C ++ソースの代わりに、Cソースファイルがある場合test.c

#include "testheader.h"
int main()
{
  return 0;
}

そして、gccでコンパイルすると、次のエラーが発生します。

error: redefinition of struct myinnerstruct

それで、Cバージョンのスコープは翻訳単位であり、C ++バージョンはブロックスコープであると私は収集しますか?誰かがこれが事実であることを確認できますか、そして多分それが理にかなっている理由を私に教えてください?私はCとC++のコードを混ぜ合わせていますが、これはかなりの問題を引き起こしています。

どんな洞察も大歓迎です。ありがとう!

4

4 に答える 4

2

Cでは、ネストされた構造体は実際には親スコープに存在しません。ただし、C++ではそれらteststruct::innerstructは-とは異なるタイプinnerstructです。これは、C++コードでのカプセル化を改善するためです。このルールがないと、同じ名前空間内の2つのタイプでネストされたiteratorクラスを定義できません。たとえば、これは非常に悪いことです。

Cは構造体を他の非常にばかげた方法で扱うので、ここで間違ったことをしたのは当然です。ただし、Cはそれ以外の場合は型スコープを許可せず、ここで適切なルールを設定すると、言語に多くの追加の概念が導入されます。最終的には、namespacesの導入が必要になりますが、何らかの理由でこれは実行されませんでした。

于 2012-05-17T01:14:00.270 に答える
2

Cでは、内部構造体の定義は外部構造体の外側にありますが、C++ではそうではありません。

これは、このブログで説明されています。C99およびc ++ 98 ISO標準を参照して、CとC++ のその他の多くの点でISOCとISOC++の非互換性。

于 2012-05-17T01:20:19.227 に答える
1

Cにはスコープがないため、すべてが「グローバル」名前空間にあります(C++で言えば)

于 2012-05-17T01:09:01.597 に答える
0

ボットCおよびC++で機能するよりクリーンな方法は次のとおりです。

struct myinnerstruct
{
    int x;
};

struct mystruct
{
  struct myinnerstruct astruct;
};
于 2012-05-17T01:17:54.670 に答える