web-dev-qa-db-ja.com

構造体の「警告:空の宣言での無用のストレージクラス指定子」

typedef struct item {
    char *text;
    int count;
    struct item *next;
};

だから私は上記のように定義されたノードを持つこの構造体を持っていますが、Imは以下のエラーを受け取り、何が悪いのか理解できません。

警告:空の宣言での不要なストレージクラス指定子};

11
spacing

よくわかりませんが、次のように試してください。

typedef struct item {
  char *text;
  int count;
  struct item *next;
}item;
16
Cariamole

Typedefは、名前を付けなかったので役に立ちません。 typedefは決して使用できません。 typedefは役に立たないため、警告が表示されます。

5
gnasher729

次のようにtypedefキーワードを削除すると、構造体は実際にはまだ警告なしで使用できます。

struct item {
    char *text;
    int count;
    struct item *next;
};

変数宣言に 'struct'キーワードを含めるだけです。つまり.

struct item head;

他の人が指摘したように、構造体定義の最後に名前を含めると、それをtypedefとして使用でき、構造体キーワードがなくても警告が表示されなくなりますが、これにより「アイテム」の最初のインスタンスが不要になります。

typedef struct {
    char *text;
    int count;
    struct item *next;
} item;

item head;

警告も取り除きます。

2
codeasaurus

typedefは、Cの既存の型の簡略表記を作成するために使用されます。これは#defineに似ていますが、typedefはコンパイラーによって解釈され、より高度な機能を提供しますプリプロセッサ。

最も単純な形式では、typedefは次のように与えられます

typedef existing_type new_type;

例えば、

typedef unsigned long UnsignedLong;

たとえば、size_tの定義をルートにトレースすると、次のことがわかります。

/* sys/x86/include/_types.h in FreeBSD */
/* this is machine dependent */
#ifdef  __LP64__
typedef unsigned long       __uint64_t;
#else
__extension__
typedef unsigned long long  __uint64_t;
#endif
...
...
typedef __uint64_t  __size_t;   

その後

/* stddef.h */
typedef __size_t    size_t;

これは、実際には、size_tunsigned long longのエイリアスであることを意味します。これは、マシンにある64ビットモーダル(LP64、ILP64、LLP64)によって異なります。

あなたの質問では、新しいタイプを定義しようとしましたが、名前を付けていません。 struct item {..}の定義で混乱しないようにしてください。これは、宣言する型にすぎません。 struct item {...}全体を基本タイプ、たとえばintに置き換え、typedefを書き換えると、次のような結果になります。

typedef int; /* new type name is missing */

正しいフォームは

typedef struct item {...} Item;

さまざまな構造の定義については、以下の例を参照してください

#include <stdio.h>

/* a new type, namely Item, is defined here */
typedef struct item_t {
  char *text;
  int count;
  struct item_t *next; /* you canot use Item here! */
} Item;

/* a structure definition below */
struct item {
  char *text;
  int count;
  struct item *next;
};

/* an anonymous struct
* However, you cannot self-refence here 
*/
struct {
  int i;
  char c;
} anon;

int main(void) {
  /* a pointer to an instance of struct item */
  struct item *pi;

  /* Shorthand for struct item_t *iI */
  Item *iI;

  /* anonymoous structure */
  anon.i = 9;
  anon.c = 'x';
  return 0;
}
1
fnisi