Recientemente, estoy compilando los códigos ffmpeg en Windows, use VS2010 con el compilador Intel. Para los siguientes códigos:
void ff_dcadsp_init(DCADSPContext *s) { s->lfe_fir = dca_lfe_fir_c; if (ARCH_ARM) ff_dcadsp_init_arm(s); } la macro ARCH_ARM se define como 0 .
Cuando lo compilo en Linux, no hay ninguna función en ff_dcadsp_init_arm() en el archivo de objeto, ¿mientras que lo hace en Windows? Así que quiero asegurarme de que el compilador haga algo con respecto a los códigos inútiles y cómo configurarlo para el compilador INTEL.
Por lo general, la mayoría de los compiladores son capaces de encargarse de ese tipo de código muerto , eliminando efectivamente esa instrucción/bloque en particular. Sin embargo, AFAIK no está garantizado y puede diferir entre compiladores y/o configuraciones de nivel de optimización proporcionadas.
Sin embargo, si desea que esto se maneje en el estado de preprocesamiento en sí mismo (debería ser un mejor enfoque, en mi humilde opinión, ya que ARCH_ARM es una MACRO), puede utilizar las declaraciones del preprocesador #if para eliminar la dependencia del nivel de optimización del compilador.
Por ejemplo, en general
void ff_dcadsp_init(DCADSPContext *s) { //something common code #if ARCH_ARM //this {#if...#endif} block ff_dcadsp_init_arm(s); //only get compiled if ARCH_ARM evaluates to non-zero #endif //something more common code }Si ARCH_ARM es una macro, probablemente estaría mejor con algo como:
void ff_dcadsp_init(DCADSPContext *s) { s->lfe_fir = dca_lfe_fir_c; #if ARCH_ARM != 0 ff_dcadsp_init_arm(s); #endif }Entonces no tiene que preocuparse por lo que hará un optimizador. El estándar C en sí mismo no exige que se elimine el código "muerto", esto depende totalmente de cómo quiera hacerlo cada implementación.
El estándar exige el uso de la funcionalidad C estándar como #if y, por lo tanto, es mucho más portátil.