M PI работает с математикой.h но не с cmath в Visual Studio



Я использую 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 или математике.ч? Если да, то как могу ли я заставить его работать с cmath?



обновление: если я определяю _USE_MATH_DEFINES в GUI, это работает. Любой ключ, почему это происходит?

654   4  

4 ответов:

интересно, что я проверил это на моем приложении, и я получил ту же ошибку.

Я потратил некоторое время просматривал заголовки, чтобы увидеть, если было что-нибудь фдоон выставление _USE_MATH_DEFINES и ничего не нашли.

поэтому я переместил

#define _USE_MATH_DEFINES
#include <cmath>

чтобы быть первым в моем файле (я не использую PCHs, поэтому, если вы это сделаете, вам придется иметь его после #include "stdafx.h") И вдруг он прекрасно компилируется.

попробуйте переместить его выше по странице. Полностью не уверен, почему это может вызвать проблемы, хотя.

Edit: понял. #Include происходит в защитниках заголовка cmath. Это означает, что что-то выше в списке #includes включает cmath без указанного #define. математика.h специально разработан таким образом, что вы можете включить его снова с тем, что определение теперь изменилось, чтобы добавить M_PI и т. д. Это не относится к cmath. Поэтому вам нужно убедиться, что вы #define _USE_MATH_DEFINES, прежде чем включать что-либо еще. Надеюсь, что проясняет это для вас:)

в противном случае просто включите математику.h вы используете нестандартный C / C++ , как уже указывалось:)

Edit 2: или, как указывает Дэвид в комментариях, просто сделайте себе константу, которая определяет значение, и у вас есть что-то более портативное в любом случае :)

можно добавить параметр / D_USE_MATH_DEFINES в командную строку компиляции или определить макрос в настройках проекта. Это приведет к перетаскиванию символа во все доступные темные углы включаемых и исходных файлов, оставляя ваш источник чистым для нескольких платформ. Если вы установите его глобально для всего проекта, вы не забудете его позже в новом файле(файлах).

это работает для меня:

#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 является первой строкой, он не будет компилироваться. #в том числе по математике.h вместо cmath не имеет значения.

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

сведения об отключении предварительно скомпилированных заголовков см., например https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx

было бы неплохо, если бы MS изменила/исправила это. Я преподаю вводные курсы программирования в большом университете, и объясняя это новичкам никогда не погружается, пока они не сделали ошибку и боролся с этим в течение дня или около того.

Comments

    Ничего не найдено.