Vì vậy, tôi biết rằng trong C
bạn cần liên kết mã với thư viện toán học, libm
, để có thể sử dụng các chức năng của nó. Hôm nay, trong khi tôi đang cố gắng để chứng minh điều này với một người bạn, và giải thích lý do tại sao bạn cần phải làm điều này, tôi đã đi qua tình huống sau đây mà tôi không hiểu.hằng số chữ so với biến trong thư viện toán
Xét đoạn mã sau:
#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;
}
Nếu VARIABLE
được định nghĩa, bạn cần liên kết chống lại libm
như bạn thường mong đợi; nếu không bạn sẽ nhận được lỗi liên kết thông thường main.c:(.text+0x29): undefined reference to sqrt
cho biết trình biên dịch không thể tìm thấy định nghĩa cho hàm sqrt
. Tôi đã ngạc nhiên khi thấy rằng nếu tôi nhận xét #define VARIABLE
, mã chạy tốt và kết quả là chính xác!
Tại sao tôi cần phải liên kết đến libm
khi biến được sử dụng nhưng tôi không cần phải làm như vậy khi hằng số chữ được sử dụng? Trình biên dịch tìm định nghĩa của sqrt
khi thư viện không được liên kết như thế nào? Tôi đang sử dụng gcc 4.4.5
trong linux.
"chỉ được kích hoạt khi đối số là biểu thức liên tục" - Tôi tin rằng nếu bạn biên dịch với '-O2', phiên bản có' VARIABLE' được xác định sẽ không còn gọi hàm runtime 'sqrt()' nữa. và sẽ không cần phải được liên kết với 'libm'). Ngoài ra, chỉ vì vậy độc giả không nhận được ý tưởng rằng đây là một cái gì đó chỉ được thực hiện bởi GCC, loại tối ưu hóa thường được thực hiện bởi bất kỳ trình biên dịch C/C++. –