Efrit
Posts: 6183
|
Столкнулся с забавным фактом. Не знаю, баг ли это или фича - но штука странная.
В общем, если в опциях компилятора gcc включена поддержка c++11, то перестаёт работать инклуд математических констант из <cmath> - например, хорошо всем знакомых M_PI и M_E.
Если отключить поддержку нового стандарта - то всё инклудится хорошо, как и раньше...
Пришлось использовать <qmath.h> (в Qt) - с ним такой проблемы не наблюдается. Вроде бы, это полный аналог <cmath>, или всё же нет?
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
22.04.2012 23:33 |
|
Efrit
Posts: 6183
|
Так это же то же самое, что и <cmath>.
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
23.04.2012 00:05 |
|
gamecreator
Posts: 7107
|
|
23.04.2012 01:13 |
|
Efrit
Posts: 6183
|
gamecreator Wrote:точно? ты проверял?
Да точно, это известный факт. Это же C++, в ней вся стандартная сишная библиотека не имеет расширений. Недаром же ты пишешь просто include <iostream>... Вот, Википедия подтверждает.
gamecreator Wrote:из math.h тоже не подтягивает пи и е?
Тоже, естественно.
gamecreator Wrote:попробуй открыть cmath и посмотреть, может там надо какой-нибудь идентификатор объявить типа USE_MATH_DEFINES?
Легко сказать - открой и посмотри Там же повсюду условная компиляция с огромным числом констант... Да и прекрасно всё работает без каких-либо идентификаторов, если не под c++11 пытаться.
gamecreator Wrote:кажись, еще в 9-й студии нужно было объявлять (не говоря уже о всех последующих)
А причём здесь студия? Я же не под ней работаю...
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
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: 6183
|
Википедия Wrote:Каждый заголовочный файл из стандартной библиотеки языка Си включен в стандартную библиотеку языка C++ под различными именами, созданных путем отсечения расширения .h и добавлением 'c' в начале, например, 'time.h' стал 'ctime'.
Это же, кстати, относится и к <cstring>. А вот <iostream> - да, всё-таки другой.
gamecreator Wrote:если совсем невмоготу - скинь файл, найти - дело пары минут.
Ну вот, погляди
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
23.04.2012 09:25 |
|
gamecreator
Posts: 7107
|
|
23.04.2012 09:46 |
|
Efrit
Posts: 6183
|
И что с этого? Даже если компиляция действительно идёт по указанной тобой ветке, то константы оттуда всё равно не инклудятся...
Ты лучше скажи мне, по какой ветке идёт компиляция при включении c++11
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
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: 6183
|
Да причём здесь вообще всё это? Ну да, объявлены они в math.h, и что?
Про проблему с использованием c++11 здесь ни слова не сказано...
Есичо, я пробовал дефайнить _USE_MATH_DEFINES перед инклудом <cmath> - не помогало.
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
23.04.2012 10:08 |
|
gamecreator
Posts: 7107
|
|
23.04.2012 10:16 |
|
Efrit
Posts: 6183
|
Вот и я про что. Либо что-то дополнительно надо дефайнить, либо действительно баг.
По крайней мере, в Qt помогает инклуд <qmath.h> - а вот как быть в "чистом" gcc, я даже не знаю...
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
23.04.2012 10:18 |
|
Efrit
Posts: 6183
|
gamecreator Wrote:самому писать нужные функции
Ага, как же
Code:
#ifdef WAR_TIME
#undef M_PI
#define M_PI 4 // в военное время число PI может достигать четырёх
#endif // WAR_TIME
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
|
|
23.04.2012 10:49 |
|