Quindi, so che in C
è necessario collegare il codice alla libreria matematica, libm
, per poter utilizzare le sue funzioni. Oggi, mentre stavo cercando di dimostrarlo ad un amico e spiegare perché è necessario farlo, mi sono imbattuto nella seguente situazione che non capisco.costante letterale vs variabile nella libreria matematica
Si consideri il seguente codice:
#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;
}
Se VARIABLE
è definito, è necessario collegare contro libm
come ci si aspetterebbe; in caso contrario si ottiene il solito errore di collegamento main.c:(.text+0x29): undefined reference to sqrt
che indica che il compilatore non riesce a trovare la definizione per la funzione sqrt
. Sono stato sorpreso di vedere che se commento #define VARIABLE
, il codice funziona bene e il risultato è corretto!
Perché è necessario collegarsi a libm
quando si utilizzano variabili, ma non è necessario farlo quando vengono utilizzate costanti letterali? In che modo il compilatore trova la definizione di sqrt
quando la libreria non è collegata? Sto usando gcc 4.4.5
sotto Linux.
"attivato solo quando l'argomento è un'espressione costante" - Credo che se si compila con '-O2', la versione con' VARIABLE' definita non sarà più chiamare il 'sqrt()' funzione di runtime (e non sarà necessario collegarsi a 'libm'). Inoltre, solo così i lettori non hanno l'idea che questo è qualcosa fatto solo da GCC, questo tipo di ottimizzazione viene generalmente eseguita da qualsiasi compilatore C/C++. –