2017-04-07 115 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)