2

UNIXでディレクトリリストを印刷する次のコードがあります。

struct dirent *res;
struct DIR *dir;
scanf("%s",str);
dir=opendir(str);
if(dir==NULL)
{
    perror("Invalid directory");
    return 1;
}
res=(struct dirent *)readdir(dir);
while(res)
{
    printf("%s\n",res->d_name);
    res=(struct dirent *)readdir(dir);
}

上記のコードをコンパイルすると、次の警告が表示されます

ls.c:16:17: warning: passing argument 1 of ‘readdir’ from incompatible pointer type   
      [enabled by default]
/usr/include/dirent.h:164:23: note: expected ‘struct DIR *’ but argument is of type 
     ‘struct DIR *’
ls.c:20:21: warning: passing argument 1 of ‘readdir’ from incompatible pointer type  
    [enabled by default]
/usr/include/dirent.h:164:23: note: expected ‘struct DIR *’ but argument is of type 
    ‘struct DIR *’

foo「予期される引数ですが、引数の型は次のとおりです」と言うとき、GCCは正確に何を意味しfooますか?

私もstruct DIR dir代わりに*dirand&dirの代わりに使用しようとしdirましたが、次のエラーが発生します

ls.c:7:12: error: storage size of ‘dir’ isn’t known

PS: コードの出力は問題ありません。

4

2 に答える 2

8

DIR は一般に に展開されるマクロなstruct somethingので、宣言していますstruct struct something *dir。これはどうやら紛らわしいことであり (GCC では問題ないように見えますが)、紛らわしいエラー メッセージが表示されます。DIR *dir解決策は、.なしで単に宣言することstructです。

于 2013-10-08T13:47:29.037 に答える
0

ベンはあなたの問題に対する正しい解決策を持っていますが、これは gcc がこのエラーを報告する方法において深刻な問題のように見えます。

まず第一に、それはマクロの問題ではありませんでした。DIRのtypedefですstruct __DIR(少なくともそれがここにあり、同じエラーメッセージが表示されます)。struct DIRによって宣言されたもの以外にはありませんstruct DIR *dir;が、gccはその名前の別のタイプがあると言っているようです。

このサンプル コンパイル ユニットは、問題をより明確に示しています。

struct foo {
  int a,b,c;
};

typedef struct foo bar;

void do_bar(bar *);

void func(void)
{
  int i = 0;

  /* do_bar wants a bar *, which is a struct foo *, but we're giving it an
     int * instead. What will gcc say? */
  do_bar(&i);
}

gcc レポート:

t.c: In function ‘func’:
t.c:15:7: warning: passing argument 1 of ‘do_bar’ from incompatible pointer type [enabled by default]
t.c:7:10: note: expected ‘struct bar *’ but argument is of type ‘int *’

しかしstruct bar、コードにはまったくありません。typedef を取得し、その前に理由もなくbar単語を詰め込みました。struct

于 2013-10-08T14:07:16.130 に答える