Помощь - Поиск - Пользователи - Календарь
Полная версия: #define M_PI
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
compiler
Добрый день!
Надо было вчера быстро написать программу (что б решить дом. задание)), а на компе только Си пришлось писать и вот столкнулся с такой проблемой...
пишу программку(сильно упращенная версия)
#include <math.h>
int main(void){
double d= M_PI;
return 0;
}

и получаю ошибку `M_PI' undeclared (first use this function), хотя в math.h, четко написанно
Цитата
/* Traditional/XOPEN math constants (double precison) */
/*...*/
#define M_PI 3.14159265358979323846


если же define M_PI, прописывать непосредственно в сурсе программы, то все работает.
функции типа cos(), sin() и тд вызываются...

компилятор gcc
IDE Dev-C++

заранее благодарен
volvo
Цитата
(сильно упращенная версия)
Вот эта "сильно упрощенная версия" у тебя компилируется? Насколько я вижу, #define M_PI в заголовочном файле закомментирован...
compiler
Цитата(volvo @ 22.11.2007 17:15) *
Вот эта "сильно упрощенная версия" у тебя компилируется? Насколько я вижу, #define M_PI в заголовочном файле закомментирован...
упс, закомментированно должно было быть тронточие.. сейчас исправлю.

зы если бы компилировалась я б в math.h не заглядывалsmile.gif
volvo
Вот так выглядит фрагмент math.h?
#ifndef __STRICT_ANSI__
#define M_E 2.7182818284590452354
#define M_LOG2E 1.4426950408889634074
#define M_LOG10E 0.43429448190325182765
#define M_LN2 0.69314718055994530942
#define M_LN10 2.30258509299404568402
#define M_PI 3.14159265358979323846
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.78539816339744830962
#define M_1_PI 0.31830988618379067154
#define M_2_PI 0.63661977236758134308
#define M_2_SQRTPI 1.12837916709551257390
#define M_SQRT2 1.41421356237309504880
#define M_SQRT1_2 0.70710678118654752440
#endif
Тогда надо смотреть на командную строку компилятора. Если там присутствует параметр -ansi, то __STRICT_ANSI__ является определенной, и все те #define определения просто не существуют...

Я не знаю, что там творится в DevC++, но Сode::Blocks этот параметр не добавляет, поэтому все прекрасно компилируется... В крайнем случае можно сделать так:

#ifdef __STRICT_ANSI__
#undef __STRICT_ANSI__
#include <math.h>
#define __STRICT_ANSI__
#else
#include <math.h>
#endif
(подчеркиваю, в крайнем случае - лучше такого не делать)
compiler
>> Вот так выглядит фрагмент math.h? ...
да
>>Тогда надо смотреть на командную строку компилятора. Если там присутствует параметр -ansi
присутствует..
>>Я не знаю, что там творится в DevC++, но Сode::Blocks этот параметр не добавляет, поэтому все прекрасно компилируется...
изменил Compiler Options(убрал поддержку ANSI), все работает... спасибо!
Siata
Надо еще одну строчку дописать:


#define _USE_MATH_DEFINES
#include <math.h>
int main(void){
double d= M_PI;
return 0;
}

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.