visual tutorial studio professional descargar community c++ visual-studio visual-studio-2010

tutorial - visual studio c++ descargar



M_PI funciona con math.h pero no con cmath en Visual Studio (4)

Estoy usando Visual Studio 2010. He leído que en C ++ es mejor usar <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?


Considere agregar el interruptor / D_USE_MATH_DEFINES a su línea de comandos de compilación, o definir la macro en la configuración del proyecto. Esto arrastrará el símbolo a todos los rincones oscuros accesibles de los archivos de inclusión y origen, dejando su fuente limpia para múltiples plataformas. Si lo configura globalmente para todo el proyecto, no lo olvidará más tarde en un nuevo archivo (s).


Curiosamente, verifiqué esto en una aplicación mía y obtuve el mismo error.

Pasé un rato revisando los encabezados para ver si había algo que no confirmara el _USE_MATH_DEFINES y no encontré nada.

Así que moví la

#define _USE_MATH_DEFINES #include <cmath>

para ser lo primero en mi archivo (no uso PCHs así que si lo haces tendrás que tenerlo después del #include "stdafx.h") y de repente compila perfectamente.

Intenta moverlo más arriba en la página. Sin embargo, no estoy seguro de por qué esto causaría problemas.

Editar : lo descubrí. El #include ocurre dentro de los guardias de encabezado de cmath. Esto significa que algo más arriba en la lista de #includes incluye cmath sin el #define especificado. math.h está diseñado específicamente para que pueda incluirlo de nuevo con esa definición ahora modificada para agregar M_PI, etc. Este no es el caso con cmath. Por lo tanto, debe asegurarse de que # defina _USE_MATH_DEFINES antes de incluir algo más. Espero que lo aclare :)

En su defecto, solo incluya math.h usted está utilizando C / C ++ no estándar como ya se señaló :)

Edit 2 : O como David señala en los comentarios solo hazte una constante que define el valor y tienes algo más portátil de todos modos :)


Este sigue siendo un problema en VS Community 2015 y 2017 al crear consolas o aplicaciones de Windows. Si el proyecto se crea con encabezados precompilados, los encabezados precompilados se cargan aparentemente antes de cualquiera de los #includes, por lo que incluso si #define _USE_MATH_DEFINES es la primera línea, no se compilará. #incluyendo math.h en lugar de cmath no hace la diferencia.

Las únicas soluciones que puedo encontrar son comenzar desde un proyecto vacío (para consola simple o aplicaciones de sistema integrado) o agregar / Y- a los argumentos de línea de comando, lo que desactiva la carga de encabezados precompilados.

Para obtener información sobre la desactivación de encabezados precompilados, consulte, por ejemplo, https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx

Sería bueno si MS modificara / arreglara esto. Enseño cursos introductorios de programación en una universidad grande, y explicar esto a los novatos nunca se hunde hasta que cometen el error y tienen problemas por una tarde más o menos.


Esto funciona para mí:

#define _USE_MATH_DEFINES #include <cmath> #include <iostream> using namespace std; int main() { cout << M_PI << endl; return 0; }

Compila e imprime pi como debería: cl /O2 main.cpp /link /out:test.exe .

Debe haber un desajuste en el código que ha publicado y el que está intentando compilar.

Asegúrese de que no haya ningún encabezado precompilado antes de su #define .