Por lo tanto, sé que en C
necesita vincular el código a la biblioteca matemática, libm
, para poder usar sus funciones. Hoy, mientras trataba de demostrarle esto a un amigo, y explicar por qué necesita hacer esto, me encontré con la siguiente situación que no entiendo.constante literal vs variable en la biblioteca matemática
Considere el siguiente código:
#include <math.h>
#include <stdio.h>
/* #define VARIABLE */
int main(void)
{
#ifdef VARIABLE
double a = 2.0;
double b = sqrt(a);
printf("b = %lf\n",b);
#else
double b = sqrt(2.0);
printf("b = %lf\n",b);
#endif
return 0;
}
Si se define VARIABLE
, es necesario enlazar con libm
como normalmente se esperaría; de lo contrario, obtendrá el error de enlace main.c:(.text+0x29): undefined reference to sqrt
habitual que indica que el compilador no puede encontrar la definición para la función sqrt
. Me sorprendió ver que si comento #define VARIABLE
, el código funciona bien y el resultado es correcto.
¿Por qué tengo que vincular a libm
cuando se usan variables, pero no es necesario cuando se usan constantes literales? ¿Cómo encuentra el compilador la definición de sqrt
cuando la biblioteca no está vinculada? Estoy usando gcc 4.4.5
en Linux.
"sólo se activa cuando el argumento es una expresión constante" - Creo que si se compila con '-O2', la versión con' VARIABLE' definido no llamará a la 'sqrt() la función de tiempo de ejecución '(y no será necesario vincularlo a 'libm'). Además, para que los lectores no tengan la idea de que esto solo lo hace GCC, este tipo de optimización generalmente la realiza cualquier compilador de C/C++. –