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