1

何らかの理由でエラーが発生しています:

expected identifier or '(' before 'wordlist'

wordlistポインターを返す 2 つの関数のヘッダー ファイル (および対応する関数定義) で。

次のコードを使用します。

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

typedef struct word{
   char *string;
   struct word* next;
}word;

typedef struct wordlist{
   word *head;
   word *tail;
}wordlist;

*wordlist populateList(FILE *file);

*wordlist encrypt(wordlist *wl, int rotation);

void toFile(wordlist *wl, char *outputFileName);

#endif

これがなぜなのか誰か教えてもらえますか?

4

3 に答える 3

1

これは、ポインターを宣言するときに、アスタリスクを型名の前ではなく、型名の後に付ける必要があるためです。

wordlist * populateList(FILE *file);
//       ^
//       |
//      Here
于 2013-04-08T01:38:09.327 に答える
0

変数を定義または宣言する場合は、変数の型の後に変数名を指定します。したがって、タイプの変数が必要な場合は、wordlist次を使用します。

wordlist myVariable;

変数を変数型へのポインターに指定する場合は、変数名の前にアスタリスクを付けます。そのため、型の変数へのポインターである変数が必要な場合は、次のwordlistように使用します。

wordlist *myVariable;

ほとんどの経験豊富な C プログラマーが変数名にアスタリスクを付ける理由は、次のような理由によるものです。

wordlist myVariable, *pVariable1, myVariable2, *pVariable2;

上記により、4 つの変数が作成されます。 myVariableタイプwordlistです。myVariable2タイプwordlistです。 pVariable1pVariable2へのポインタ型wordlistです。

したがって、アスタリスクは、変数が指定された型ではなく、指定された型へのポインターであることを示す、変数名宣言の一種の形容詞、修飾子、または修飾子として機能します。

結合された変数の定義は、次の 4 行の定義と同じです。

wordlist myVariable;  // declares a variable of type wordlist
wordlist *pVariable1; // declares a pointer to a variable of type wordlist
wordlist myVariable2; // declares a variable of type wordlist
wordlist *pVariable2;  // declares a pointer to a variable of type wordlist

関数の定義/宣言も同様に機能します。

wordlist *myFunc (void) {
    wordlist *myNew = malloc (sizeof(wordlist));

    if (myNew) {
        // set up myNew stuff
    }

    return myNew;
}

編集:関数ポインタ

関数ポインターを含む変数を指定することもできます。たとえば、上記の myFunc() の場合、次のように指定できます。特定の評価順序を強制するために括弧を使用していることに注意してください。つまり、pFunc は、引数を受け入れず (void 引数リスト)、wordlist 変数へのポインターを返す関数へのポインターです。C には演算子と修飾子の優先順位に関する規則がありますが、式が複雑になるにつれて、通常は括弧を使用して評価順序を強制する方が適切です。プログラムをデータとして見る: 関数ポインタ

wordlist *((*pFunc) (void)) = myFunc;   // pointer to a function that returns a pointer to a wordlist
于 2013-04-08T01:56:36.393 に答える
0

inpopulateListencryptへのポインターを返したい場合wordlist、正しい構文はwordlist *, not*wordlistです (他の場所とまったく同じです)。

于 2013-04-08T01:37:54.127 に答える