Saya menggunakan Visual Studio 2010. Saya telah membaca bahwa di C ++ lebih baik digunakan <cmath>
daripada <math.h>
.
Tetapi dalam program saya mencoba menulis (aplikasi konsol Win32, proyek kosong) jika saya menulis:
#define _USE_MATH_DEFINES
#include <math.h>
itu mengkompilasi, sementara jika saya menulis
#define _USE_MATH_DEFINES
#include <cmath>
itu gagal dengan
kesalahan C2065: 'M_PI': pengenal tidak dideklarasikan
Apakah ini normal? Apakah penting jika saya menggunakan cmath atau math.h? Jika ya, bagaimana cara membuatnya bekerja dengan cmath?
UPDATE : jika saya mendefinisikan _USE_MATH_DEFINES di GUI, ini berfungsi. Ada petunjuk mengapa ini terjadi?
c++
visual-studio
visual-studio-2010
hyperknot
sumber
sumber
Jawaban:
Menariknya saya memeriksa ini di aplikasi saya dan saya mendapat kesalahan yang sama.
Saya menghabiskan beberapa saat memeriksa header untuk melihat apakah ada sesuatu yang tidak sesuai
_USE_MATH_DEFINES
dan tidak menemukan apa pun.Jadi saya memindahkan
#define _USE_MATH_DEFINES #include <cmath>
menjadi hal pertama dalam file saya (saya tidak menggunakan PCH jadi jika Anda harus memilikinya setelahnya
#include "stdafx.h"
) dan tiba-tiba kompilasi dengan sempurna.Coba pindahkan lebih tinggi ke atas halaman. Benar-benar tidak yakin mengapa ini akan menyebabkan masalah.
Edit : Berhasil. Itu
#include <math.h>
terjadi dalam pelindung header cmath. Ini berarti bahwa sesuatu yang lebih tinggi dari daftar #includes termasukcmath
tanpa#define
ditentukan.math.h
dirancang khusus sehingga Anda dapat memasukkannya lagi dengan definisinya sekarang diubah menjadi tambah,M_PI
dll. Ini BUKAN kasusnyacmath
. Jadi, Anda perlu memastikan Anda#define _USE_MATH_DEFINES
sebelum memasukkan yang lain. Harapan yang menyelesaikannya untuk Anda :)Gagal yang hanya mencakup
math.h
Anda menggunakan C / C ++ non-standar seperti yang telah ditunjukkan :)Sunting 2 : Atau seperti yang ditunjukkan David di komentar, buatlah diri Anda konstan yang menentukan nilainya dan Anda tetap memiliki sesuatu yang lebih portabel :)
sumber
stdafx.h
adalah masalah OP yang pernah saya hadapi dengan perilaku ini sebelumnya.const static double
nilai daripada #defined.Pertimbangkan untuk menambahkan sakelar / D_USE_MATH_DEFINES ke baris perintah kompilasi Anda, atau untuk menentukan makro dalam pengaturan proyek. Ini akan menyeret simbol ke semua sudut gelap yang dapat dijangkau dari file penyertaan dan sumber sehingga sumber Anda bersih untuk berbagai platform. Jika Anda menyetelnya secara global untuk keseluruhan proyek, Anda tidak akan melupakannya nanti di file baru.
sumber
mex -D_USE_MATH_DEFINES
). Hanya menambahkan/Y-
di suatu tempat di beberapa file mexoptions Matlab membantu ...Ini bekerja untuk saya:
#define _USE_MATH_DEFINES #include <cmath> #include <iostream> using namespace std; int main() { cout << M_PI << endl; return 0; }
Mengkompilasi dan cetakan
pi
seperti yaitu harus:cl /O2 main.cpp /link /out:test.exe
.Harus ada ketidakcocokan kode yang telah Anda posting dan yang Anda coba kompilasi.
Pastikan tidak ada header yang telah dikompilasi yang ditarik sebelum Anda
#define
.sumber
Ini masih menjadi masalah di VS Community 2015 dan 2017 saat membuat aplikasi konsol atau windows. Jika proyek dibuat dengan header yang telah dikompilasi, header yang telah dikompilasi tampaknya dimuat sebelum #includes yang mana pun, jadi meskipun #define _USE_MATH_DEFINES adalah baris pertama, itu tidak akan dikompilasi. #termasuk math.h bukannya cmath tidak membuat perbedaan.
Satu-satunya solusi yang dapat saya temukan adalah memulai dari proyek kosong (untuk konsol sederhana atau aplikasi sistem tersemat) atau menambahkan / Y- ke argumen baris perintah, yang mematikan pemuatan header yang telah dikompilasi sebelumnya.
Untuk informasi tentang menonaktifkan header yang telah dikompilasi, lihat misalnya https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx
Alangkah baiknya jika MS akan mengubah / memperbaiki ini. Saya mengajar kursus pemrograman pengantar di universitas besar, dan menjelaskan hal ini kepada pemula tidak akan pernah meresap sampai mereka membuat kesalahan dan berjuang keras selama sekitar satu sore.
sumber
_USE_MATH_DEFINES
harus ditentukan sebelum memasukkan header apa pun. Biasanya baik melalui pengaturan proyek atau melalui tajuk konfigurasi. Salah untuk mengasumsikan bahwa hanya dengan meletakkannya di baris pertama akan menyebabkannya didefinisikan sebelum semua header.Menurut dokumentasi Microsoft tentang Konstanta Matematika :
File
ATLComTime.h
mungkin disertakan secara tidak langsung dalam proyek Anda. Dalam kasus saya, satu kemungkinan urutan penyertaan adalah sebagai berikut:sumber
-D_USE_MATH_DEFINES
dalam pengaturan kompiler default tidak cukup untuk menyelesaikan masalah ... Karena kompilasi melalui perintah Matlab mex untuk saya sendiri masalah, tidak begitu jelas untuk melacak ...Dengan CMake, itu akan terjadi
masuk
CMakeLists.txt
.sumber
Seperti yang disarankan oleh user7860670, klik kanan pada proyek, pilih properti, arahkan ke C / C ++ -> Preprocessor dan tambahkan
_USE_MATH_DEFINES
ke Definisi Preprocessor.Itulah yang berhasil bagi saya.
sumber