2011-01-13 4 views
6

¿Es mejor #definir _BSD_SOURCE o establecer CPPFLAGS = -D_BSD_SOURCE?¿Deben especificarse los estándares en el código fuente o en CPPFLAGS?

Me parece que si una parte del código fuente se basa en un estándar particular, es mejor especificarlo explícitamente en el código con un #define. Sin embargo, muchos comentarios sugieren que especificar el estándar en la línea de compilación es más apropiado. ¿Cuáles son las ventajas de omitir el estándar del código fuente y solo especificarlo en tiempo de compilación?

Respuesta

6

Si especifica define en su fuente que existe un riesgo de que el mismo fichero de cabecera puede ser incluido en varios archivos de origen (unidades de traducción) pero con diferentes definiciones de preprocesador, que puede conducir a una definición de reglas violación, que es a menudo un dolor depurar.

Al especificar se define para todo el proyecto en lugar de en los archivos fuente individuales, se reduce al mínimo la posibilidad de dicha violación a la regla de una sola definición.

Además, si es necesario agregar una nueva definición, cambie solo un archivo MAKE, en lugar de todos los archivos fuente.

+0

Pero puede usar diferentes estándares para cada unidad de traducción. Si todo el proyecto cumple con C89, excepto que una TU usa una extensión gnu, ¿no es mejor que ese archivo defina _GNU_SOURCE que empañar todo el proyecto? De esta forma, si uso una función que depende de un estándar más moderno que C89 en alguna otra TU, pero no conozco esa dependencia, lo sabré en tiempo de compilación. Si todo el proyecto depende del estándar moderno, es más difícil eliminar la dependencia. –

+0

Debo confesar que nunca mezclé y combiné fuentes que requieren estándares diferentes (o define el preprocesador) en un binario. Si lo hiciera, seguiría especificando los indicadores para esa fuente particular en el archivo MAKE (como variables específicas del objetivo) simplemente porque todos los indicadores de mi compilador están en un solo lugar en el archivo MAKE. Además, a menudo compilo mis fuentes con diferentes compiladores (g ++, SunCC) en diferentes plataformas, por lo que es el archivo MAKE específico de la plataforma que es el lugar adecuado para acomodar las definiciones específicas de la plataforma. –

+1

@William: el problema es que si intenta mezclar diferentes estándares en diferentes unidades de traducción, no hay garantía de que pueda vincular de forma segura los objetos resultantes en un único ejecutable. Podría funcionar, o podría fallar, o podría parecer que funciona, pero le dará problemas sutiles y difíciles de diagnosticar en el tiempo de ejecución. –

Cuestiones relacionadas