2017-04-07 83 views
2

我是C的新手,我开始学习头文件。虽然使用我的标题,但我收到一个错误,说invalid type argument of '->' (have struct dirent)。我不明白这是什么意思,我读here,第二个参数->必须是一个指针,所以我试图给它添加一个*ent->*d_name)但是然后我得到错误意外的令牌*,我该如何解决这个问题?这个头文件有什么问题?

#ifndef UTILIS_H_INCLUDED 
#define UTILIS_H_INCLUDED "utilis.h" 
#include <stdio.h> 
#include <dirent.h> 

char *connect(const char *pattern) 
{ 
    struct dirent ent; 
    char *d_name; 

    DIR *mgt = opendir("\\\\example\\windows7apps"); 

    while ((ent = readdir(mgt)) != pattern) 
    { 
     puts(ent->d_name); 
    } 
} 

#endif 
+1

你可能想读例如[这个'readdir'手册页](http://man7.org/linux/man-pages/man3/readdir.3.html)。 'readdir'返回什么? 'ent'的类型是什么? –

+0

如果这是一个头,你绝对不希望整个函数定义在这里。将其移动到.c文件或将其标记为“inline”。 – DeiDei

+0

@DeiDei什么是'inline'? – jakehimton

回答

3

我读到这里的第二个参数 - >必须是一个指针,

这是不对的, “第一” 的说法,或者,实际上,->的操作数OPE rator应该是指针类型的。

在你的情况下,ent不是一个指针类型,所以你不能使用指针成员解引用运算符->。 (你可以使用成员解引用运算符.代替)。

其实,在你的代码中,ent应该是一个指针,按照返回类型readdir()。因此,您最好将ent的类型更正为struct dirent *,然后您可以使用ent上的->

+0

那么'ent.d_name'? – jakehimton

+1

@jakehimton nopes,查看更新。 –

3

通常头文件只包含数据定义和函数原型。你的函数定义应该几乎可以肯定在C文件中。

如果你看一下函数readdir它返回一个指向struct dirent让你变耳鼻喉科应该是一个指针 结构的dirent * READDIR(DIR * dirp);

struct dirent *ent; 

这将解决您的错误invalid type argument of '->' (have struct dirent)