Efrit
Posts: 6184
|
Столкнулся с забавным фактом. Не знаю, баг ли это или фича - но штука странная.
В общем, если в опциях компилятора gcc включена поддержка c++11, то перестаёт работать инклуд математических констант из <cmath> - например, хорошо всем знакомых M_PI и M_E.
Если отключить поддержку нового стандарта - то всё инклудится хорошо, как и раньше...
Пришлось использовать <qmath.h> (в Qt) - с ним такой проблемы не наблюдается. Вроде бы, это полный аналог <cmath>, или всё же нет?
Welcome!
|
|
22.04.2012 23:33 |
|
Efrit
Posts: 6184
|
Так это же то же самое, что и <cmath>.
Welcome!
|
|
23.04.2012 00:05 |
|
gamecreator
Posts: 7107
|
|
23.04.2012 01:13 |
|
Efrit
Posts: 6184
|
gamecreator Wrote:точно? ты проверял?
Да точно, это известный факт. Это же C++, в ней вся стандартная сишная библиотека не имеет расширений. Недаром же ты пишешь просто include <iostream>... Вот, Википедия подтверждает.
gamecreator Wrote:из math.h тоже не подтягивает пи и е?
Тоже, естественно.
gamecreator Wrote:попробуй открыть cmath и посмотреть, может там надо какой-нибудь идентификатор объявить типа USE_MATH_DEFINES?
Легко сказать - открой и посмотри Там же повсюду условная компиляция с огромным числом констант... Да и прекрасно всё работает без каких-либо идентификаторов, если не под c++11 пытаться.
gamecreator Wrote:кажись, еще в 9-й студии нужно было объявлять (не говоря уже о всех последующих)
А причём здесь студия? Я же не под ней работаю...
Welcome!
|
|
23.04.2012 08:56 |
|
gamecreator
Posts: 7107
|
(23.04.2012 08:56)Efrit Wrote: Недаром же ты пишешь просто include <iostream>
вот как раз iostream не равно iostream.h. поэтому и пишу
(23.04.2012 08:56)Efrit Wrote: Легко сказать - открой и посмотри Там же повсюду условная компиляция с огромным числом констант...
поиск люди придумали для таких ситуаций. я же находил в свое время. если совсем невмоготу - скинь файл, найти - дело пары минут.
(23.04.2012 08:56)Efrit Wrote: А причём здесь студия? Я же не под ней работаю...
так файлы то могут быть и похожи. или по-твоему они их с нуля переписывают для каждого компилятора?
When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
|
|
23.04.2012 09:12 |
|
Efrit
Posts: 6184
|
Википедия Wrote:Каждый заголовочный файл из стандартной библиотеки языка Си включен в стандартную библиотеку языка C++ под различными именами, созданных путем отсечения расширения .h и добавлением 'c' в начале, например, 'time.h' стал 'ctime'.
Это же, кстати, относится и к <cstring>. А вот <iostream> - да, всё-таки другой.
gamecreator Wrote:если совсем невмоготу - скинь файл, найти - дело пары минут.
Ну вот, погляди
Welcome!
|
|
23.04.2012 09:25 |
|
gamecreator
Posts: 7107
|
|
23.04.2012 09:46 |
|
Efrit
Posts: 6184
|
И что с этого? Даже если компиляция действительно идёт по указанной тобой ветке, то константы оттуда всё равно не инклудятся...
Ты лучше скажи мне, по какой ветке идёт компиляция при включении c++11
Welcome!
|
|
23.04.2012 09:56 |
|
gamecreator
Posts: 7107
|
math.h включается всегда в cmath. так что:
Code:
#if defined(_USE_MATH_DEFINES) && !defined(_MATH_DEFINES_DEFINED)
#define _MATH_DEFINES_DEFINED
/* Define _USE_MATH_DEFINES before including math.h to expose these macro
* definitions for common math constants. These are placed under an #ifdef
* since these commonly-defined names are not part of the C/C++ standards.
*/
/* Definitions of useful mathematical constants
* M_E - e
* M_LOG2E - log2(e)
* M_LOG10E - log10(e)
* M_LN2 - ln(2)
* M_LN10 - ln(10)
* M_PI - pi
* M_PI_2 - pi/2
* M_PI_4 - pi/4
* M_1_PI - 1/pi
* M_2_PI - 2/pi
* M_2_SQRTPI - 2/sqrt(pi)
* M_SQRT2 - sqrt(2)
* M_SQRT1_2 - 1/sqrt(2)
*/
#define M_E 2.71828182845904523536
#define M_LOG2E 1.44269504088896340736
#define M_LOG10E 0.434294481903251827651
#define M_LN2 0.693147180559945309417
#define M_LN10 2.30258509299404568402
#define M_PI 3.14159265358979323846
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.785398163397448309616
#define M_1_PI 0.318309886183790671538
#define M_2_PI 0.636619772367581343076
#define M_2_SQRTPI 1.12837916709551257390
#define M_SQRT2 1.41421356237309504880
#define M_SQRT1_2 0.707106781186547524401
#endif /* _USE_MATH_DEFINES */
более того,
math.h Wrote:These are placed under an #ifdef since these commonly-defined names are not part of the C/C++ standards.
что означает, что в gcc их быть не может, основная фишка gcc - стандарты же
When all gods have burnt to ashes in eternity of sorrow,
Demons gonna tear your soul because there is no tomorrow.
(This post was last modified: 23.04.2012 10:04 by gamecreator.)
|
|
23.04.2012 10:01 |
|
Efrit
Posts: 6184
|
Да причём здесь вообще всё это? Ну да, объявлены они в math.h, и что?
Про проблему с использованием c++11 здесь ни слова не сказано...
Есичо, я пробовал дефайнить _USE_MATH_DEFINES перед инклудом <cmath> - не помогало.
Welcome!
|
|
23.04.2012 10:08 |
|
gamecreator
Posts: 7107
|
|
23.04.2012 10:16 |
|
Efrit
Posts: 6184
|
Вот и я про что. Либо что-то дополнительно надо дефайнить, либо действительно баг.
По крайней мере, в Qt помогает инклуд <qmath.h> - а вот как быть в "чистом" gcc, я даже не знаю...
Welcome!
|
|
23.04.2012 10:18 |
|
Efrit
Posts: 6184
|
gamecreator Wrote:самому писать нужные функции
Ага, как же
Code:
#ifdef WAR_TIME
#undef M_PI
#define M_PI 4 // в военное время число PI может достигать четырёх
#endif // WAR_TIME
Welcome!
|
|
23.04.2012 10:49 |
|