2009-04-23 4 views
9

Estoy intentando utilizar el nftw para procesar algunos archivos en un directoriocon 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; 

} 

Cuando estoy compilación (gcc -o kconfig_parser.c analizador), Tengo esta advertencia y este error ..

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 

he comprobado la definición de la estructura y el prototipo de la devolución de llamada, y algunos ejemplos, que debería estar bien ... ¿Qué estoy haciendo mal? (He quitado casi todo de mi código para desactivarla) ...

gracias

Respuesta

9

Linux, por alguna razón, todavía usa SUSv1 para esta API, donde nfsw() todavía se considera una extensión.

Desde el Linux manual page, el include tiene que ser:

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

En realidad, ligada a la especificación de cómo SUSv2 nftw se supone que funciona (que desde entonces he actualizado para el enlace SUSv3). En un sistema compatible con SUSv2 o SUSv3, no debería necesitar ese #define, pero parece que lo puede necesitar en Linux. –

+0

genial ... funciona ... No lo sabía ... gracias – LB40

+0

Brian: De hecho, tienes razón. En la parte inferior de la página del nuevo manual, puede leer: "Problema 5: movido de la extensión X/OPEN UNIX a BASE". Entonces, originalmente era una extensión X/OPEN, luego se movió a la base. Por alguna razón, Linux todavía está utilizando SUSv1 de esta API. – Juliano

0

Hmm. Tu código funciona para mí. Compruebe sus rutas de inclusión, tal vez? Aunque este es un encabezado de sistema, entonces debería ser bastante difícil perder esto. ¿O estaba compilando accidentalmente una versión que no tenía la línea #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 ... 

edición: El ensayo anterior se hizo en Mac OS X. En un (ahora suprimido) comentar el OP mencionó que estaba en Debian, para lo cual the man page menciona que #define _XOPEN_SOURCE 500 es necesario, como señala Juliano.

Cuestiones relacionadas