Подтвердить что ты не робот

Использование M_PI со стандартом C89

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Я пошел бы за

#ifndef M_PI
#    define M_PI 3.14159265358979323846
#endif

Ответ 3

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

Ответ 4

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

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

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

-std=c89 -D_USE_MATH_DEFINES

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

-std=c89 -DM_PI=3.14159265358979323846