¿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?
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. –
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. –
@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. –