2010-06-23 12 views
11

Trabajo en una base de código que es mayormente C con un poco de C++, y está construida principalmente con gcc pero ocasionalmente necesita ser construida con MSVC. El compilador de C de Microsoft sigue siendo prácticamente C89 con unas pocas extensiones menores, y aún no admite el código mixto y las definiciones de variable a la C++/C99. Así que tengo que encontrar una forma de evitar que los desarrolladores escriban definiciones de código/variable fuera de servicio mientras trabajan con gcc; de lo contrario, la compilación se rompe posteriormente con MSVC. Si uso gcc -std=c89, todo se rompe porque los comentarios al estilo C++ no están permitidos (puede haber otros problemas también, pero no he investigado esto más). Si uso gcc -std=gnu89, entonces las definiciones de código/variable fuera de orden están permitidas, por lo que tampoco me sirve. Algunas ideas ? Supongo que solo necesito algo como gcc -std=c99 -fno-inline-variable-definitions, si existiera tal opción.Cómo aplicar declaraciones variables de estilo C89 en gcc?

Respuesta

13

que está buscando las opciones -Wall-Wextra-Wstrict-prototypes-Wold-style-definition-Wmissing-prototypes-Wmissing-declarations y -Wdeclaration-after-statement, tal como se describe en el gcc warnings info page. Tenga en cuenta que esto puede causar mucho ruido a causa de problemas en los archivos de encabezado del sistema, y ​​son solo advertencias, por lo que debe tener una política de entusiasmo por tener una compilación de advertencia cero.

+0

Gracias - No había visto '-Wdeclaration-after-statement' - eso debería ayudar un poco - ahora todo lo que tengo que hacer es asegurarme de que los desarrolladores arreglen todas sus advertencias. –

+10

Puede hacer '-Wdeclaration-after-statement -Werror = declaration-after-statement' para convertirlo en un error. –

+0

@Matthew: Eso es un fragmento que no sabía. –

3

No creo que haya una manera de hacer lo que quiere. El dialecto de C soportado por MSVC está más cerca de C89 que de C99 (por ejemplo, no es compatible con los inicializadores designados); realmente quieres algo más parecido a C89-with-C++ - comments-and-inline-keyword.

El problema con que es que los comentarios de C++ pueden afectar la corrección del código C89 válido. Por ejemplo, el significado de esta línea cambia sustancialmente:

int a = 10//* foo */2; 

yo diría que lo mejor es hacer cumplir C89 en los archivos de origen C, incluyendo los comentarios de estilo C89. Sin embargo, inline probablemente esté bien: puede definirlo en __inline en gcc.

+0

La otra respuesta funciona, pero creo que es demasiado complicada. Me gusta esta respuesta mejor. Simplemente no use comentarios de estilo C++. – Omnifarious

+0

Desafortunadamente, este es un gran código base con muchos desarrolladores: hacer una búsqueda masiva y reemplazar los comentarios sería un gran esfuerzo (especialmente todos los problemas de control de fuente que resultarían de esto) y los desarrolladores probablemente se rebelarían si forzado a usar comentarios C de estilo antiguo. También puede haber otras restricciones C89 que no podríamos solucionar. Realmente * necesitamos * GNU89 o C99, pero sin las declaraciones de variables de estilo C++ que hacen que MSVC genere errores. –

1

No es Win32 el que hace que el código no sea compilable, sino el compilador. Puede usar GCC on Win32 y obtener una mayor compatibilidad multiplataforma.

Otra posibilidad es utilizar la compilación de C++ para su compilación Win32; la compilación de GCC ya habrá determinado que es válida C, y la compilación de C++ también la hará más fuerte C también.

[editar] Otra solución es utilizar un servidor de integración continua como CruiseControl configurado de manera que cuando los codificadores plataforma CCG código de entrada, el servidor de CI puede comprobarlo y construirlo usando VC++ (o incluso aplicar una herramienta de análisis estático de terceros) y, por error, enviar por correo electrónico los resultados al usuario que ingresó el código erróneo. Esta solución puede ser pesada para el problema original, pero puede ofrecer muchos otros beneficios además.

+0

'gcc -std = c89' does ** NOT ** permite comentarios al estilo C++, por lo tanto, esta no es una solución viable. –

+0

@Paul R: Perdón, Paul. Borré esa declaración antes de publicar el comentario (y después de leer su publicación con más cuidado). – Clifford

+0

@Clifford - no hay problema - se eliminó el voto negativo. Sin embargo, la compilación de C++ probablemente no sea una opción: tendríamos que hacer muchos cambios en la base de códigos, p. lanzando el resultado de llamadas a malloc y tratando con muchas otras diferencias sutiles entre C y C++. –

Cuestiones relacionadas