Estoy usando Visual Studio 2010. He leído que en C ++ es mejor usar en <cmath>
lugar de <math.h>
.
Pero en el programa que estoy tratando de escribir (aplicación de consola Win32, proyecto vacío) si escribo:
#define _USE_MATH_DEFINES
#include <math.h>
compila, mientras que si escribo
#define _USE_MATH_DEFINES
#include <cmath>
falla con
error C2065: 'M_PI': identificador no declarado
¿Es normal? ¿Importa si uso cmath o math.h? Si es así, ¿cómo puedo hacer que funcione con cmath?
ACTUALIZACIÓN : si defino _USE_MATH_DEFINES en la GUI, funciona. ¿Alguna pista de por qué está pasando esto?
c++
visual-studio
visual-studio-2010
hipernudo
fuente
fuente
Respuestas:
Curiosamente, verifiqué esto en una aplicación mía y obtuve el mismo error.
Pasé un tiempo revisando los encabezados para ver si había algo debajo de la definición
_USE_MATH_DEFINES
y no encontré nada.Así que moví el
para ser lo primero en mi archivo (no uso PCH, así que si lo eres, tendrás que tenerlo después
#include "stdafx.h"
) y de repente se compila perfectamente.Intente moverlo hacia arriba en la página. Sin embargo, estoy totalmente inseguro de por qué esto causaría problemas.
Editar : lo descubrí. El
#include <math.h>
ocurre dentro de los protectores de cabecera de cmath. Esto significa que algo más arriba en la lista de #includes se incluyecmath
sin el#define
especificado.math.h
está diseñado específicamente para que pueda incluirlo nuevamente con esa definición ahora cambiada para agregar,M_PI
etc. Este NO es el caso concmath
. Por lo tanto, debe asegurarse#define _USE_MATH_DEFINES
antes de incluir cualquier otra cosa. Espero que eso te aclare :)Si no lo incluye
math.h
, está utilizando C / C ++ no estándar como ya se señaló :)Edición 2 : O, como David señala en los comentarios, simplemente conviértase en una constante que defina el valor y, de todos modos, tendrá algo más portátil :)
fuente
stdafx.h
es el problema de los OPs. Me he enfrentado a este comportamiento antes.const static double
conviértalo en un valor en lugar de # definido.Considere agregar el modificador / D_USE_MATH_DEFINES a su línea de comando de compilación, o definir la macro en la configuración del proyecto. Esto arrastrará el símbolo a todas las esquinas oscuras accesibles de los archivos de origen e inclusión, dejando su fuente limpia para múltiples plataformas. Si lo configura globalmente para todo el proyecto, no lo olvidará más adelante en un nuevo archivo (s).
fuente
mex -D_USE_MATH_DEFINES
). Solo/Y-
ayudó agregar smewhere en algunos archivos de opciones de Matlab mexoptions ...Esto funciona para mi:
Compila y grabados
pi
como SI debe:cl /O2 main.cpp /link /out:test.exe
.Debe haber una discrepancia entre el código que ha publicado y el que está intentando compilar.
Asegúrese de que no haya encabezados precompilados antes de su
#define
.fuente
Esto sigue siendo un problema en VS Community 2015 y 2017 al crear aplicaciones de consola o de Windows. Si el proyecto se crea con encabezados precompilados, los encabezados precompilados aparentemente se cargan antes que cualquiera de los #includes, por lo que incluso si #define _USE_MATH_DEFINES es la primera línea, no se compilará. # Incluir math.h en lugar de cmath no hace ninguna diferencia.
Las únicas soluciones que puedo encontrar son comenzar desde un proyecto vacío (para una consola simple o aplicaciones integradas del sistema) o agregar / Y- a los argumentos de la línea de comandos, lo que desactiva la carga de encabezados precompilados.
Para obtener información sobre cómo deshabilitar los encabezados precompilados, consulte, por ejemplo, https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx
Sería bueno que MS cambiara / arreglara esto. Doy cursos de introducción a la programación en una gran universidad, y explicar esto a los novatos nunca se asimila hasta que cometen el error y luchan con él durante una tarde más o menos.
fuente
_USE_MATH_DEFINES
debe definirse antes de incluir cualquier encabezado. Normalmente, a través de la configuración del proyecto o mediante el encabezado de configuración. Es incorrecto suponer que simplemente ponerlo en la primera línea hará que se defina antes de todos los encabezados.Según la documentación de Microsoft sobre constantes matemáticas :
El archivo
ATLComTime.h
puede incluirse indirectamente en su proyecto. En mi caso, un posible orden de inclusión fue el siguiente:fuente
-D_USE_MATH_DEFINES
la configuración predeterminada del compilador no es suficiente para resolver el problema ... Dado que la compilación se realizó a través del comando Matlab mex para el mío problema, no es tan obvio rastrear ...Como lo sugirió el usuario 7860670, haga clic con el botón derecho en el proyecto, seleccione propiedades, navegue hasta C / C ++ -> Preprocesador y agregue
_USE_MATH_DEFINES
a las Definiciones del preprocesador.Eso es lo que funcionó para mí.
fuente
Con CMake solo sería
en
CMakeLists.txt
.fuente