1

出于某种原因,我收到了错误:

expected identifier or '(' before 'wordlist'

在我的头文件(以及相应的函数定义)中返回wordlist指针的两个函数。

使用以下代码:

#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

如果 inpopulateList并且encrypt您想返回指向 的指针wordlist,则正确的语法是wordlist *,而不是*wordlist(与其他任何地方完全相同)。

于 2013-04-08T01:37:54.127 回答
0

如果要定义或声明变量,请指定变量的类型,后跟变量名。因此,如果您想要一个类型的变量,wordlist您将使用:

wordlist myVariable;

如果要将变量指定为指向变量类型的指针,请在变量名称前加上星号,因此,如果您想要一个指向类型变量的指针的变量,则wordlist可以使用:

wordlist *myVariable;

大多数有经验的 C 程序员将星号与变量名放在一起的原因如下:

wordlist myVariable, *pVariable1, myVariable2, *pVariable2;

以上将创建四个变量。 myVariable是类型wordlistmyVariable2是类型wordlistpVariable1并且pVariable2是指向 的类型指针wordlist

因此,星号作为变量名声明的一种形容词或限定词或修饰符,表明该变量不是指定的类型,而是指向指定类型的指针。

组合变量定义与以下四行定义相同。

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 回答