Использование M_PI со стандартом C89 - PullRequest
23 голосов
/ 15 февраля 2011

Я использую C и пытаюсь получить доступ к константе M_PI (3.14159 ...). Я импортировал заголовочный файл math.h, но константа M_PI все еще не была определена. В результате поиска в StackOverflow я обнаружил, что мне нужно добавить #define _USE_MATH_DEFINES в мой код (см. Пример кода ниже). Это нормально работает при обычной компиляции, но мне нужно иметь возможность компилировать с флагом std=c89 для работы, которую я делаю.

Как мне получить доступ к M_PI из некоторого кода C89?

Ответы [ 4 ]

38 голосов
/ 15 февраля 2011

Соответствующий стандартный файл библиотеки math.h не только не требуется, но фактически не должен определять M_PI по умолчанию. В этом контексте «по умолчанию» означает, что M_PI должен определяться только с помощью специфических для компилятора приемов, чаще всего неопределенного поведения с использованием зарезервированных идентификаторов.

Просто определите константу самостоятельно (вы можете свободно использовать имя M_PI, но если вы хотите иметь возможность компилировать код с помощью несоответствующего компилятора, вы должны сначала проверить, что M_PI еще не определено) , Ради соглашения, не определяйте M_PI как что-либо отличное от (приближения) pi.

25 голосов
/ 15 февраля 2011

Я бы пошел на

#ifndef M_PI
#    define M_PI 3.14159265358979323846
#endif
9 голосов
/ 15 февраля 2011

M_PI не требуется стандартом C, это просто общее расширение, поэтому, если вы хотите быть стандартом, вам не следует полагаться на него. Тем не менее, вы можете легко определить свой собственный #define для него, в прошлый раз, когда я проверил, что это универсальная константа, так что нет места для путаницы. :)

8 голосов
/ 15 февраля 2011

Я не вижу, в чем здесь проблема; нет несовместимости между -std = c89 и _USE_MATH_DEFINES, один определяет, какой язык компилятор компилирует, другой определяет, какие части math.h будут включены.

Те части, которые включены, не определены как часть стандарта ISO C library , но это не то же самое, что не быть стандартным языком C, язык и библиотека - это отдельные объекты в C. не менее совместим с C89, чем если бы вы определили свои собственные макросы в своем собственном заголовке.

Однако я бы предложил, чтобы вы определяли макрос в командной строке, а не в коде:

-std=c89 -D_USE_MATH_DEFINES

Если вы когда-либо сталкивались с реализацией math.h, которая не определяет M_PI, то это легко исправить без модификации кода, аналогичным образом используя макросы, определенные в командной строке:

-std=c89 -DM_PI=3.14159265358979323846
...