Использование M_PI со стандартом C89
Я использую C и пытаюсь получить доступ к константе M_PI (3.14159...). Я импортировал файл заголовка math.h, но константа M_PI все еще была undefined. Через некоторый поиск в StackOverflow я обнаружил, что мне нужно добавить #define _USE_MATH_DEFINES
в мой код (см. Пример кода ниже). Это нормально работает при компиляции, но мне нужно скомпилировать флаг std=c89
для работы, которую я делаю.
Как мне получить доступ к M_PI из некоторого кода C89?
Ответы
Ответ 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