Can';t用-std=c99查找数学h常数?

Can';t用-std=c99查找数学h常数?,c,gcc,compiler-errors,C,Gcc,Compiler Errors,我有一个简单的测试代码,t.c: #include <stdio.h> #include <math.h> int main(){ printf("%f\n", M_LN10); } 我认为GCC没有理由在math.h中查找并接受M_LN10,默认的C标准没有问题,但如果强制执行C99,就没有问题。知道这里发生了什么吗?将-D_BSD_SOURCE或-D_XOPEN_SOURCE添加到GCC命令中。类似于gcc-std=c99-D\u XOPEN\u SOURCE

我有一个简单的测试代码,
t.c

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

int main(){
  printf("%f\n", M_LN10);
}

我认为GCC没有理由在
math.h
中查找并接受
M_LN10
,默认的C标准没有问题,但如果强制执行C99,就没有问题。知道这里发生了什么吗?

-D_BSD_SOURCE
-D_XOPEN_SOURCE
添加到GCC命令中。类似于
gcc-std=c99-D\u XOPEN\u SOURCE t.c

在我的系统上查找math.h文件后,
M_LN10
定义如下:

#if defined __USE_BSD || defined __USE_XOPEN
# define M_LN10         2.30258509299404568402  /* log_e 10 */
#endif

请阅读
man feature\u test\u macros
info libc“feature test macros”
,以便能够给出更好的建议。名称以
开头的宏绝不会公开。(
\uuuu FILE\uuuu
\uuuu LINE\uuuu
是历史上的反常现象,在你提出它们之前。)@shanet你不认为这样的定义会有其他副作用吗?@rici我今天学到了一些东西。:)用适当的宏更新了我的答案。谢谢。是的,你说得对;添加
-D\u BSD\u源代码就可以了。在OS X系统上
math.h
声明
M_LN10
而不使用
ifdef
。。。奇怪。@DouglasB.stuble在OSX上也有gcc吗?有点奇怪,虽然有点道理,因为OSX内核与BSD高度相关。gcc默认的“标准”不是标准。它是
gnu90
,它是“1990年的C标准加上GNU扩展”。使用XSI math.h定义而不设置XOPEN\u SOURCE是GNU扩展,在指定实际标准时不可用。@rici谢谢,这增加了一些清晰度。我习惯于添加扩展,而不是删除它们。添加扩展和添加标准之间有区别:)(或者换句话说,新标准是旧标准的进步——希望是——但不是扩展。)C标准没有提到m_*常量。它是由GNUC、BSD和其他标准定义的,但不是由C定义的——所以当您指定非GNU的内容时,gcc会禁用此功能,使其更接近标准。
#if defined __USE_BSD || defined __USE_XOPEN
# define M_LN10         2.30258509299404568402  /* log_e 10 */
#endif