LINUX.ORG.RU

C: а корректен ли такой код (всего одна строчка)?


0

0

Код такой

const double PI = 4.0 * atan(1.0);

gcc на него ругается (предупреждением), но все же компилит. Watcom ругается и не компилит. Основная идея его использования: вычислить выражение раз при запуске программы, а потом запретить его изменение.

PS. Естественно, в начале файла стоит #include <math.h>

Использовать вот так

#define PI (4.0 * atan(1.0))

плохо, т.к. будет вычисляться функция каждый раз при использовании константы.

Кто знает, на сколько это корректно?

> gcc на него ругается (предупреждением), но все же компилит. Watcom ругается и не компилит. Основная идея его использования: вычислить выражение раз при запуске программы, а потом запретить его изменение.

И о чем предупреждает gcc?

> #define PI (4.0 * atan(1.0)) плохо, т.к. будет вычисляться функция каждый раз при использовании константы.

Не будет

> Код такой >const double PI = 4.0 * atan(1.0);

А нельзя заменить это выражение следующим образом: const double PI = M_PI

:-)

anonymous
()

Если тебе нужна константа, то вычисли её на калькуляторе и напиши в файл. Компилятор != калькулятор, поэтому и warning, так-как atan есть нечто, что существует помимо воли компилятора и в общем случае вообще хз где.

yz
()
Ответ на: комментарий от anonymous

и зачем вообще константа, пешы

#define PI M_PI

anonymous
()

Странно, я уже не помню этот момент в С++, но там вроде можно было константы вычислять в рантайме.

В крайнем случае напиши double PI = 4 * atan(1);

PS MSVC++ не ругается на вариант с const.

Legioner ★★★★★
()

IIRC, в Си нельзя использовать вызовы функций в инициализаторах глобальгых объектов.

Чем плох M_PI?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Угу, не обратил внимания на заголовок. comeau ругается если в C-mode компилировать.

Legioner ★★★★★
()

Отвечаю всем и сразу:

1. Как это вариант с #define не будет вычисляться каждый раз? Конечно, компилятор может постараться и соптимизировать этот код, но гарантий никаких и зависит от компилятора.

2. M_PI ничем не хуже, этот вопрос возник, скажем так, из праздного любопытства по поводу поведения С. В Страуструпе, помнится, читал, что в С++ такие вещи вытворять можно, со стандартом С99 я как-то не очень знаком, все больше К.&Р., а в нем const вообще нет, вот и стало интересно, как const работает в С.

Спасибо всем ответившим!

Alexey-ZAR
() автор топика
Ответ на: комментарий от yz

>Компилятор != калькулятор

А зачем тогда так любят выпендриваться, высчитывая Фибоначи на темплейтах? :)

...

Это в Си++. А в Форте - так там компилятор, например, может просто любые операции языка проводить во время компиляции :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

%cat test.c
#include <stdio.h>
#include <math.h>

int main()
{
        const double PI = 4.0 * atan(1.0);
        printf("%lf\n",PI);
        return 0;
}
%gcc -Wall -o test test.c
%./test
3.141593
%gcc --version
gcc (GCC) 4.2.2
Copyright (C) 2007 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

в твоем примере автоматическая переменная. Ее инициализация происходит в момент исполнения функции. Так в Си можно.

В топике же речь шла о глобальной переменной, размещаемой в секции данных. В Си++ можно инициализировать ее так. В Си нет.

dilmah ★★★★★
()
Ответ на: комментарий от KRoN73

> А зачем тогда так любят выпендриваться, высчитывая Фибоначи на темплейтах? :)

Вот и я думаю, зачем? :-)

yz
()
Ответ на: комментарий от saahriktu

%cat test.c
#include <stdio.h>
#include <math.h>

const double PI = 4.0 * atan(1.0);

int main()
{
printf("%lf\n",PI);
return 0;
}
%gcc -Wall -o test test.c
test.c:4: предупреждение: элемент инициализатора не является константой
test.c:4: предупреждение: (где-то рядом с инициализацией для 'PI')
%./test
3.141593

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

собственно, топикстартер это в первых строчках и написал: "gcc на него ругается (предупреждением), но все же компилит."

Ему уже объяснили что это нарушение стандарта и не работает на других компиляторах.

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.