Estou usando o Visual Studio 2010. Li que em C ++ é melhor usar <cmath>
do que usar <math.h>
.
Mas no programa que estou tentando escrever (aplicativo de console Win32, projeto vazio) se eu escrever:
#define _USE_MATH_DEFINES
#include <math.h>
ele compila, enquanto se eu escrever
#define _USE_MATH_DEFINES
#include <cmath>
falha com
erro C2065: 'M_PI': identificador não declarado
Isso é normal? Faz diferença se eu usar cmath ou math.h? Se sim, como posso fazer funcionar com o cmath?
ATUALIZAÇÃO : se eu definir _USE_MATH_DEFINES na GUI, funciona. Alguma pista de por que isso está acontecendo?
c++
visual-studio
visual-studio-2010
hyperknot
fonte
fonte
Respostas:
Curiosamente, verifiquei isso em um aplicativo meu e recebi o mesmo erro.
Passei um tempo verificando os cabeçalhos para ver se havia algo undef'ing o
_USE_MATH_DEFINES
e não encontrei nada.Então mudei o
para ser a primeira coisa no meu arquivo (eu não uso PCHs, então se você usar terá que tê-lo depois de
#include "stdafx.h"
) e de repente compilar perfeitamente.Tente movê-lo para cima na página. Totalmente inseguro quanto ao motivo disso causar problemas.
Edit : Descobri isso. O
#include <math.h>
ocorre dentro dos protetores de cabeçalho de cmath. Isso significa que algo mais acima na lista de #includes está incluindocmath
sem o#define
especificado.math.h
é projetado especificamente para que você possa incluí-lo novamente com aquela definição agora alterada para adicionarM_PI
etc. Este NÃO é o caso decmath
. Portanto, você precisa ter certeza#define _USE_MATH_DEFINES
antes de incluir qualquer outra coisa. Espero que tudo se esclareça para você :)Se não incluir,
math.h
você está usando C / C ++ não padrão, como já apontado :)Edição 2 : Ou, como David aponta nos comentários, torne-se uma constante que defina o valor e você terá algo mais portátil de qualquer maneira :)
fonte
stdafx.h
é o problema de OPs que já enfrentei antes.const static double
vez de #defined.Considere adicionar a opção / D_USE_MATH_DEFINES à linha de comando de compilação ou definir a macro nas configurações do projeto. Isso arrastará o símbolo para todos os cantos escuros acessíveis dos arquivos de inclusão e fonte, deixando sua fonte limpa para várias plataformas. Se você configurá-lo globalmente para todo o projeto, não o esquecerá mais tarde em um (s) novo (s) arquivo (s).
fonte
mex -D_USE_MATH_DEFINES
). Apenas adicionar/Y-
smewhere em algum arquivo mexoptions do Matlab ajudou ...Isso funciona para mim:
Compila e imprime
pi
como deveria:cl /O2 main.cpp /link /out:test.exe
.Deve haver uma incompatibilidade entre o código que você postou e o que está tentando compilar.
Certifique-se de que não haja cabeçalhos pré-compilados puxados antes de seu
#define
.fonte
Isso ainda é um problema no VS Community 2015 e 2017 ao construir aplicativos de console ou do Windows. Se o projeto é criado com cabeçalhos pré-compilados, os cabeçalhos pré-compilados são aparentemente carregados antes qualquer um dos #includes, portanto, mesmo se #define _USE_MATH_DEFINES for a primeira linha, ele não será compilado. #incluir math.h em vez de cmath não faz diferença.
As únicas soluções que posso encontrar são iniciar a partir de um projeto vazio (para console simples ou aplicativos de sistema embutido) ou adicionar / Y- aos argumentos de linha de comando, o que desativa o carregamento de cabeçalhos pré-compilados.
Para obter informações sobre como desabilitar cabeçalhos pré-compilados, consulte por exemplo https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx
Seria bom se a MS mudasse / corrigisse isso. Eu ensino cursos introdutórios de programação em uma grande universidade, e explicar isso aos novatos nunca cai na cabeça até que eles cometam o erro e lutassem com ele por uma tarde ou assim.
fonte
_USE_MATH_DEFINES
deve ser definido antes de incluir qualquer cabeçalho. Normalmente, por meio da definição do projeto ou do cabeçalho de configuração. É errado assumir que simplesmente colocá-lo na primeira linha fará com que seja definido antes de todos os cabeçalhos.De acordo com a documentação da Microsoft sobre Constantes Matemáticas :
O arquivo
ATLComTime.h
pode ser incluído indiretamente em seu projeto. No meu caso, uma possível ordem de inclusão era a seguinte:fonte
-D_USE_MATH_DEFINES
as configurações do compilador padrão não é suficiente para resolver o problema ... Já que a compilação foi feita por meio do comando Matlab mex para mim problema, não é tão óbvio de rastrear ...Conforme sugerido pelo usuário7860670, clique com o botão direito do mouse no projeto, selecione propriedades, navegue até C / C ++ -> Pré-processador e adicione
_USE_MATH_DEFINES
às Definições do pré-processador.Isso é o que funcionou para mim.
fonte
Com CMake seria apenas
no
CMakeLists.txt
.fonte