2009-04-23 12 views
9

Sto cercando di utilizzare il nftw per elaborare alcuni file in una directoryWarning con 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; 

} 

Quando sto compilando (gcc -o kconfig_parser.c parser), Ho questo avvertimento e questo errore ..

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 

ho controllato la definizione della struct e il prototipo della richiamata, e alcuni esempi, si dovrebbe andare bene ... che cosa sto facendo di sbagliato? (Ho rimosso quasi tutto del mio codice per cancellarlo) ...

grazie

risposta

9

Linux, per qualche motivo, utilizza ancora SUSv1 per questa API, dove nfsw() è ancora considerato un'estensione.

Dal Linux manual page, l'inclusione deve essere:

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

In realtà, ho legato alla specifica SUSv2 per come nftw dovrebbe funzionare (che allora ho aggiornato al link SUSv3). Su un sistema compatibile SUSv2 o SUSv3, non dovresti aver bisogno di #define, ma sembra che tu possa averne bisogno su Linux. –

+0

fantastico ... funziona ... non lo sapevo ... grazie – LB40

+0

Brian: In effetti, hai ragione. Nella parte inferiore della nuova pagina di manuale è possibile leggere: "Problema 5: spostato dall'estensione X/OPEN UNIX a BASE.". Quindi, originariamente era un'estensione X/OPEN, quindi spostato alla base. Per qualche ragione, Linux sta ancora utilizzando SUSv1 di questa API. – Juliano

0

Hmm. Il tuo codice funziona per me. Controlla i percorsi di inclusione, forse? Anche se questa è un'intestazione di sistema, quindi dovrebbe essere piuttosto difficile perderlo. O stavi accidentalmente compilando una versione che non aveva la linea #include <ftw.h>?

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

modificare: La prova di cui sopra è stato fatto su Mac OS X. In una (ora cancellato) Commento del PO detto che era su Debian, per il quale the man page afferma che #define _XOPEN_SOURCE 500 è necessario, come sottolinea Juliano.