【问题标题】:Simple C program compiles on OS X but not Fedora 16, math.h included but not used简单的 C 程序在 OS X 上编译,但在 Fedora 16 上编译,包括但未使用 math.h
【发布时间】:2026-01-29 22:20:11
【问题描述】:

所有代码都可以在这里找到https://github.com/cole-christensen/airC

这似乎很明显,但它不起作用。 #include <math.h> 存在,但无法识别 M_PI

airC.c: In function ‘x_curved’:
airC.c:94:33: error: ‘M_PI’ undeclared (first use in this function)

系统信息

gcc version 4.6.2 20111027 (Red Hat 4.6.2-1) (GCC)
Linux fedora-oe 3.2.6-3.fc16.x86_64

我认为它只能与自动工具有关。随意批评我的烂摊子:)

编辑:

不赞成投反对票和指向无用答案的链接。

手册页明确声明 M_PI 已定义,而 M_PI 实际上是在 /usr/include/math.h 中的 #ifdef 后面定义的,我不明白。

【问题讨论】:

  • 这是一个不充分的答案。 /usr/include/math.h 确实有 M_PI 并且 math.h 的联机帮助页说“ 标头应提供以下常量。” M_PI 紧随其后。
  • 你能发布 ifdef 吗?可能有助于找出为什么找不到它。
  • /* 一些有用的常量。 */ #如果定义了 __USE_BSD ||已定义 __USE_XOPEN

标签: c macos gcc fedora autotools


【解决方案1】:

M_PI 不是标准 C。

您必须定义 _GNU_SOURCE 才能在 Linux 上启用它。 OS X 是从 BSD 派生的,所以那里的规则可能不同。

【讨论】:

  • 有没有一种理智的方法可以以简单的多平台方式做到这一点? (最好使用自动工具)
  • 是的,在您的configure.ac 中测试 M_PI。如果找不到,请在定义 _GNU_SOURCE 的情况下重试,如果可行,请将 -D_GNU_SOURCE 添加到您的 CFLAGS(或您选择的其他变量)。
  • __GNU_SOURCE 可能是要查找的错误宏,M_PI 带有 POSIX,因此应该使用那里的功能。实际上,您通常不必处理此问题。 __XOPEN_SOURCE 应该包含您的系统实现的实际 POSIX 版本。为 POSIX 预见的编译器接口称为c99,如果使用它而不是gcc 会触发正确的定义,请尝试一下。
  • 我刚刚在 Ubuntu 上尝试过:gcc 提供 M_PI 没有任何额外内容,gcc -ansi 没有,gcc -std=c99 也没有,c99 也没有。在所有情况下,定义 _GNU_SOURCE 会再次定义 M_PI
  • 可能__XOPEN_SOURCE更多正确的,我不知道。