typedef struct item {
char *text;
int count;
struct item *next;
};
だから私は上記のように定義されたノードを持つこの構造体を持っていますが、Imは以下のエラーを受け取り、何が悪いのか理解できません。
警告:空の宣言での不要なストレージクラス指定子};
よくわかりませんが、次のように試してください。
typedef struct item {
char *text;
int count;
struct item *next;
}item;
Typedefは、名前を付けなかったので役に立ちません。 typedefは決して使用できません。 typedefは役に立たないため、警告が表示されます。
次のように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;
警告も取り除きます。
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_t
がunsigned 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;
}