2014-09-04 71 views
3

我試圖使用從文件math.h庫中恆M_LN2但似乎總是得到一個編譯錯誤。該代碼是:如何使用M_LN2從MATH.H

#include <stdio.h> 
#include <math.h> 

int main(){ 

double x = M_LN2; 
printf("%e",x); 

return 0; 
} 

在Ubuntu上用gcc編譯

gcc -std=c99 lntester.c -o lntester -lm 

獲得輸出:

error: 'M_LN2' undeclared 

理解爲什麼發生這種情況的任何幫助,將不勝感激。

如下所述,if def沒有被定義,並且使用gcc和c99導致了這個問題。下面是解決問題並允許我使用c99的編譯代碼。

gcc -std=c99 -D_GNU_SOURCE lntested.c -o lntester -lm 

回答

4

理解爲什麼發生這種情況將大大 知道的任何幫助。

您可以打開/usr/include/math.h並嘗試找到M_LN2的定義。對我來說,它的定義和包裹由條件宏:

#if defined __USE_BSD || defined __USE_XOPEN 
... 
# define M_LN2   0.69314718055994530942 /* log_e 2 */ 
... 
#endif 

當您編譯選項-std=c99既不__USE_BSD沒有定義__USE_XOPEN你的代碼,所以它通過if define包裹所有的變量沒有定義過。

但您可以編譯代碼而不-std=c99選項或-std=gnu99選項,而不是。

+0

好的,所以我已經在代碼中發佈了問題的解決方案。感謝您幫助理解if defs是它發生的原因。 – CSnewb 2014-09-06 22:12:41