C: перечислимый VS #define для математических констант?

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

#define PI 3.14159265
#define SPEEDOFLIGHT 2.99792458e8

или

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

Спасибо

9
задан Alex Marcotte 7 August 2010 в 20:17
поделиться

5 ответов

Не используйте для этого переменные 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 незаметно преобразует их в более низкую точность по мере необходимости.

12
ответ дан 4 December 2019 в 07:13
поделиться

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

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

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

10
ответ дан 4 December 2019 в 07:13
поделиться

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

5
ответ дан 4 December 2019 в 07:13
поделиться

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

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

enum color
{
  red = 0xFF0000;
  yellow = 0xFFFF00;
  baby_puke_green = 0x9ACD32;
}
1
ответ дан 4 December 2019 в 07:13
поделиться

Поскольку перечисления являются целочисленными константами, я бы выбрал #define .

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

3
ответ дан 4 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: