2

私の講師は、以下が有効なC++ステートメントであると主張して私を驚かせました。

struct charlistrecord *next

完全な条件は、C /C++で再帰データ型を次のように宣言することで見つかりました。

typedef struct charlistrecord
{
     char data;
     struct charlistrecord *next;
} *charlist;

これが構文として受け入れられた時期があったのか、それともC++を知っていると何ヶ月も考えていたのかどうかを知りたいです。

4

4 に答える 4

2

C ++およびtypedefの想定以前は、型付き構造を取得する唯一の方法はこの構文を使用することであり、自己型リンクノードを取得する唯一の方法でした。

struct Foo
{
    int val;
    struct Foo *link;
};

Cでは、これにはFooの使用法が次のようになっている必要があります。

struct Foo foo;
struct Foo *foo_ptr;

等..

typedefは、これを行うことでこれを支援しました。

typedef struct Foo
{
   int val;
   struct Foo *link;
} Foo;

今からあなたはこれを行うことができます:

Foo foo;       // same as struct Foo
Foo *foo_ptr;  // same as struct Foo *

注:typedefを使用してaをエイリアスすることstruct Nameは、エイリアスとしてに制限されませんName。Yoはこれを行うのにも完全に有効でした:

typedef struct Foo
{
    int val;
    struct Foo *link;
} Bar;

そして今、以下が実行可能です。

struct Foo foo;
Bar bar;
struct Foo *fooptr = &bar;
Bar *barptr = &foo;

本当に、あなたがその日にCでプログラムしたことを望みますね?おそらく物事をクリアしないでしょうが、うまくいけば少し灰色が少なくなります。

于 2012-11-08T10:16:06.580 に答える
1

これはCからの二日酔いです。Cでは、これが構造体変数とメンバーを宣言する方法であるため、下位互換性の理由からC++では有効です。あなたの講師は少し「古い学校」のようですね。

于 2012-11-08T10:11:54.550 に答える
1

はい、完全に有効です。ここでの単語は、 が という名前の構造体型へのポインターであるstructことを明示的に示しています。nextcharlistrecord

これは C からの思い出であり、C++ ではキーワードを省略した方がよいかもしれませんが、使用したい場合は省略できます。

于 2012-11-08T10:12:21.647 に答える
0

これは完全に有効であり、次のように構造体の名前が変数によって隠されている場合にも役立ちます。

struct C {};
int C = 0;
int a;

void foo() {
  C *a; // multiplies int C by int a
  struct C *a; //defines 'a' as pointer to struct C
}
于 2012-11-08T10:25:51.810 に答える