2009-04-23 7 views
9

Ich versuche, die nftw zu verwenden, um einige Dateien in einem VerzeichnisWarnung mit nftw

#include <ftw.h> 
#include <stdio.h> 

int wrapper(const char * fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) { 
    printf("File %d\n", ftwbuf->base); 
    return(0); 
} 


int main(int argc, char ** argv) { 
    const char *name; 
    int flags = 0; 
    name = argv[1]; 
    nftw(name, wrapper, 20, flags); 
    return 0; 

} 

Wenn ich kompilieren (gcc kconfig_parser.c -o-Parser) zu verarbeiten, ich habe diese Warnung bekommen und dieser Fehler ..

kconfig_parser.c:5: warning: ‘struct FTW’ declared inside parameter list 
kconfig_parser.c:5: warning: its scope is only this definition or declaration, which is probably not what you want 
kconfig_parser.c: In function ‘wrapper’: 
kconfig_parser.c:6: error: dereferencing pointer to incomplete type 

ich die Definition der Struktur und der Prototyp des Callback überprüft haben, und einige Beispiele, sollte es in Ordnung sein ... Was mache ich falsch? (Ich habe fast alles von meinem Code entfernt, es zu löschen) ...

dank

Antwort

9

Linux verwendet aus irgendeinem Grund immer noch SUSv1 für diese API, wobei nfsw() immer noch als Erweiterung gilt.

Vom Linux manual page, die enthalten muss sein:

#define _XOPEN_SOURCE 500 
#include <ftw.h> 
+0

Eigentlich habe ich auf die SUSv2 Spezifikation verknüpft wie nftw soll (was ich auf die SUSv3 Link aktualisiert haben, da) arbeiten. Auf einem SUSv2- oder SUSv3-kompatiblen System sollten Sie #define nicht benötigen, aber es sieht so aus, als ob Sie es unter Linux brauchen könnten. –

+0

großartig ... es funktioniert ... Ich wusste das nicht ... danke – LB40

+0

Brian: In der Tat, du hast Recht. Am Ende der neuen Handbuchseite können Sie lesen: "Problem 5: Von X/OPEN UNIX-Erweiterung zu BASE verschoben.". Also war es ursprünglich eine X/OPEN-Erweiterung, die dann zur Basis verschoben wurde. Aus irgendeinem Grund verwendet Linux immer noch SUSv1 dieser API. – Juliano

0

Hmm. Dein Code funktioniert für mich. Überprüfen Sie Ihre Include-Pfade, vielleicht? Obwohl dies ein System-Header ist, sollte es ziemlich schwer sein, dies zu verpassen. Oder haben Sie versehentlich eine Version kompiliert, die die #include <ftw.h> Zeile nicht hatte?

$ gcc -o ftw ftw.c 
$ ./ftw my-directory 
File 10 
File 11 
File 16 
File 16 
File 16 
File 16 
File 16 
... etc ... 

bearbeiten: Der Test oben auf Mac OS X. In einem getan wurde (jetzt gelöscht) Kommentar der OP erwähnt er auf Debian war, für die the man page erwähnt, dass #define _XOPEN_SOURCE 500 notwendig ist, als Juliano weist darauf hin.