Я задаюсь вопросом, каков был бы лучший способ сохранить математические константы, которые используются всюду по всей программе?
#define PI 3.14159265
#define SPEEDOFLIGHT 2.99792458e8
или
enum constants { PI = 3.14159265; SPEEDOFLIGHT = 2.99792458e8; }
Спасибо
Не используйте для этого переменные 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 незаметно преобразует их в более низкую точность по мере необходимости.
Ни один из них, используйте постоянные значения для сохранения проверки типов компилятором:
static const double PI = 3.14159265;
static const double SPEEDOFLIGHT = 2.99792458e8;
#define
предназначен только для замены текста без указания типа. двойных
значений. РЕДАКТИРОВАТЬ: спасибо aaa
. Я забыл ключевое слово static
, которое особенно полезно, когда константы объявлены в заголовках c. (В C ++ статика не нужна)
Лично я предпочитаю просто сделать pi и c = 1 и позволить вселенной решить эту проблему
Согласитесь с jdehaan, предпочтите константы для более явной проверки / преобразования типов.
Кроме того, использование перечисления, как вы описали, на самом деле не является целью перечисления. Эти константы связаны только математически (если фокус-покус космолога окажется прав). Цель перечисления - объединить одинаковые значения, например:
enum color
{
red = 0xFF0000;
yellow = 0xFFFF00;
baby_puke_green = 0x9ACD32;
}
Поскольку перечисления являются целочисленными константами, я бы выбрал #define
.
Я согласен с jdehaan в том, что глобальные const
объекты даже лучше.