C: enum VS #define для математических констант? - PullRequest
9 голосов
/ 08 августа 2010

Мне интересно, как лучше хранить математические константы, которые используются во всей программе?

#define PI 3.14159265
#define SPEEDOFLIGHT 2.99792458e8

или

enum constants { PI = 3.14159265; SPEEDOFLIGHT = 2.99792458e8; }

Спасибо

Ответы [ 5 ]

12 голосов
/ 08 августа 2010

Не используйте const переменные для этого! В языке C квалифицированная переменная const это , а не константа в смысле константного выражения, поэтому ее нельзя использовать при инициализации статической / глобальной переменной. Это имеет серьезные практические последствия; например, следующее не будет работать:

static const double powers_of_pi[] = { 1, PI, PI*PI, PI*PI*PI, PI*PI*PI*PI, };

Правильное решение - #define. Вероятно, лучше использовать суффикс l, чтобы они имели тип long double и включали достаточно много десятичных разрядов, чтобы значения были правильными для типов long double до 128-битных. Затем вы можете использовать их там, где ожидается любой тип с плавающей точкой; C автоматически преобразует их в более низкую точность по мере необходимости.

10 голосов
/ 08 августа 2010

Ни один из них, используйте постоянные значения для сохранения проверки типа компилятора:

static const double PI = 3.14159265;
static const double SPEEDOFLIGHT = 2.99792458e8; 
  • #define предназначен только для замены текста и не распознается.
  • Перечисления не подходят для всех типов. Я не уверен, но я думаю, что даже для double значений.

РЕДАКТИРОВАТЬ: спасибо aaa. Я забыл ключевое слово static, особенно полезное, когда константы объявлены в заголовках c. (В C ++ статика не нужна)

5 голосов
/ 08 августа 2010

Лично я предпочитаю просто сделать пи и с = 1 и позволить вселенной разобраться с проблемой

3 голосов
/ 08 августа 2010

Поскольку enum - это целочисленные константы, я бы пошел с #define.

Я согласен с jdehaan, что глобальные const объекты еще лучше.

1 голос
/ 08 августа 2010

Согласитесь с jdehaan, предпочтите, чтобы константы выполняли более явную проверку / преобразование типов.

Кроме того, использование перечисления, как вы описали, на самом деле не является целью перечисления.Эти константы связаны только математически (если фокус-покус космолога окажется правильным).Целью перечисления является объединение одинаковых значений, таких как:

enum color
{
  red = 0xFF0000;
  yellow = 0xFFFF00;
  baby_puke_green = 0x9ACD32;
}
...