Я использую Visual Studio 2010. Я читал, что на C ++ лучше использовать <cmath>
, чем <math.h>
.
Но в программе, которую я пытаюсь написать (консольное приложение Win32, пустой проект), я пишу:
#define _USE_MATH_DEFINES
#include <math.h>
он компилируется, а если я напишу
#define _USE_MATH_DEFINES
#include <cmath>
это не с
ошибка C2065: 'M_PI': необъявленный идентификатор
Это нормально? Имеет ли значение, использую я cmath или math.h? Если да, то как заставить его работать с cmath?
ОБНОВЛЕНИЕ : если я определю _USE_MATH_DEFINES в графическом интерфейсе, он работает. Есть какие-нибудь подсказки, почему это происходит?
c++
visual-studio
visual-studio-2010
гиперкнот
источник
источник
Ответы:
Интересно, что я проверил это в своем приложении и получил ту же ошибку.
Я потратил некоторое время, проверяя заголовки, чтобы увидеть, есть ли что-нибудь, что не соответствует,
_USE_MATH_DEFINES
и ничего не нашел.Итак, я переместил
#define _USE_MATH_DEFINES #include <cmath>
быть первым в моем файле (я не использую PCH, поэтому, если вы используете, вам придется иметь его после
#include "stdafx.h"
), и вдруг он отлично компилируется.Попробуйте переместить его выше по странице. Совершенно не уверен, почему это может вызвать проблемы.
Изменить : понял это. Это
#include <math.h>
происходит внутри охранников заголовков cmath. Это означает, что что-то выше в списке #includes включеноcmath
без#define
указанного.math.h
специально разработан таким образом, чтобы вы могли включить его снова с этим определением, которое теперь изменено на добавлениеM_PI
и т. д. Это НЕ относится кcmath
. Итак, вам нужно убедиться, что вы#define _USE_MATH_DEFINES
вы включили что-либо еще. Надеюсь, это проясняет вам это :)В противном случае
math.h
вы используете нестандартный C / C ++, как уже указывалось :)Изменить 2 : Или, как указывает Дэвид в комментариях, просто сделайте себе константу, которая определяет значение, и в любом случае у вас есть что-то более портативное :)
источник
stdafx.h
это проблема OP, с которой я сталкивался раньше.const static double
а не #defined.Рассмотрите возможность добавления переключателя / D_USE_MATH_DEFINES в командную строку компиляции или определения макроса в настройках проекта. Это перетащит символ во все доступные темные углы включаемых и исходных файлов, оставляя ваш исходный код чистым для нескольких платформ. Если вы установите его глобально для всего проекта, вы не забудете его позже в новом файле (ах).
источник
mex -D_USE_MATH_DEFINES
)./Y-
Помогло только добавление smewhere в какой-то файл mexoptions Matlab ...Это работает для меня:
#define _USE_MATH_DEFINES #include <cmath> #include <iostream> using namespace std; int main() { cout << M_PI << endl; return 0; }
Компилирует и печатает
pi
как следует:cl /O2 main.cpp /link /out:test.exe
.Должно быть несовпадение кода, который вы опубликовали, и кода, который вы пытаетесь скомпилировать.
Убедитесь, что не вставляются предварительно скомпилированные заголовки перед вашим
#define
.источник
Это по-прежнему проблема в VS Community 2015 и 2017 при создании консольных приложений или приложений для Windows. Если проект создается с предварительно скомпилированными заголовками, предварительно скомпилированные заголовки явно загружаются до любого из #includes, поэтому даже если #define _USE_MATH_DEFINES является первой строкой, он не будет компилироваться. #including math.h вместо cmath не имеет значения.
Единственные решения, которые я могу найти, - это либо начать с пустого проекта (для простых консольных или встроенных системных приложений), либо добавить / Y- в аргументы командной строки, что отключает загрузку предварительно скомпилированных заголовков.
Для получения информации об отключении предварительно скомпилированных заголовков см., Например, https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx
Было бы хорошо, если бы MS изменила / исправила это. Я преподаю вводные курсы программирования в большом университете, и объяснения этого новичкам никогда не улавливаются, пока они не совершат ошибку и не будут бороться с ней в течение дня или около того.
источник
_USE_MATH_DEFINES
должен быть определен до включения каких-либо заголовков. Обычно либо через настройки проекта, либо через заголовок конфигурации. Неверно предполагать, что простое размещение его в первой строке приведет к его определению до всех заголовков.Согласно документации Microsoft о математических константах :
Файл
ATLComTime.h
может быть косвенно включен в ваш проект. В моем случае один из возможных порядков включения был следующим:источник
-D_USE_MATH_DEFINES
в настройках компилятора по умолчанию недостаточно для решения проблемы ... Поскольку компиляция выполнялась с помощью команды Matlab mex для моего собственного проблема, это не так очевидно для отслеживания ...С CMake это было бы просто
в
CMakeLists.txt
.источник
Как было предложено пользователем 7860670, щелкните проект правой кнопкой мыши, выберите свойства, перейдите к C / C ++ -> Препроцессор и добавьте
_USE_MATH_DEFINES
в определения препроцессора.Вот что у меня сработало.
источник