2011-10-31 17 views
5

Estoy usando Code :: Blocks 10.05 y mingw. Parece que el compilador no reconoce el calificador restrictivo y devuelve "error: expected ';', ',' or ')' before 'src'". ¿Debo pasar cualquier opción de compilación para compilarla correctamente?restringir el error de compilación del calificador

int inet_pton4 (const char *restrict src, unsigned char *restrict dst) 

p/s: parece MinGW no admite inet_pton4, así que trató de integrar una versión de código abierto en mi código.

Respuesta

7

Si su compilador no admite la palabra clave restrict, simplemente elimine esa palabra clave (a).

Se utiliza para indicar al compilador que usted (el desarrollador) promete que los punteros siguen ciertas propiedades que implican aliasing, y esto, a su vez, permite al compilador realizar ciertas optimizaciones que de otro modo no serían necesariamente seguras.

Si deja esa palabra clave en un compilador que la admite, impide esas optimizaciones (leve desventaja).

Si lo deja fuera de compiladores que No apoyo esa palabra clave, el inconveniente es nula (ya que no son compatibles con esas optimizaciones de todos modos) y la ventaja es considerable, como en "se compilará para usted ":-)


(a) es posible que desee asegurarse de que está en el modo de compilación C99 primera. Si bien puede ser cierto que usted está usando un viejo gcc que no entiende restrict, es igualmente posible que usted no está en el modo de compilación C99, por ejemplo, con -std=c99 (gcc documentos parecen indicar que ha sido apoyado restrict incluso de regreso a la versión 3.0).

Si, por algún motivo no puede activar el modo C99, creo que gcc tiene una extensión que le permite usar __restrict.

+1

Forma fácil de sacar la palabra clave (si es necesario): use '-Drestrict' en la línea de comando. El preprocesador se lo quitará y no tendrá que editar ningún código. Lo hace fácil de volver en el futuro si también se mueve a un compilador C99. –

3

Desde restrict es nuevo en C99, y puesto que, como señala @paxdiablo, omitiendo la palabra clave restrict en realidad no duele nada, usted puede hacer esto:

#if __STDC_VERSION__ < 199901L 
#define restrict /* nothing */ 
#endif 

poner esto en un encabezado que es #include d por todo en su proyecto (o al menos por todo lo que usa restrict).

Esto debería permitir que su código se compile con cualquier compilador de C, ya sea que sea compatible con C99 o no. Incluso debería funcionar para un compilador que no define __STDC_VERSION__.

Pero, ya que está utilizando MinGW, que utiliza gcc, utilizando gcc --std=c99 también debe resolver el problema (como @paxdiablo también señala).

Puede hacer ambas cosas sin peligro. (Y es probable que la solución #if sea útil para otros.)

Cuestiones relacionadas