C:enum VS #define用于数学常数?

时间:2010-08-07 20:17:53

标签: c math constants

我想知道在整个程序中使用的数学常量的最佳存储方法是什么?

#define PI 3.14159265
#define SPEEDOFLIGHT 2.99792458e8

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

由于

5 个答案:

答案 0 :(得分:12)

不要使用const变量!在C语言中,const限定变量在常量表达式意义上是而不是常量,因此它不能用于初始化静态/全局变量。这具有重大的实际后果;例如,以下内容不起作用:

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

正确的解决方案是#define。最好使用l后缀,以便它们具有类型long double,并包含足够多的小数位,以使这些值对于最高128位的long double类型是正确的。然后,您可以在任何预期浮点类型的地方使用它们; C会根据需要静默地将它们转换为更低的精度。

答案 1 :(得分:10)

它们都不使用常量值来保留编译器的类型检查:

static const double PI = 3.14159265;
static const double SPEEDOFLIGHT = 2.99792458e8; 
  • #define仅限文字替换,并输入“不知道”。
  • 枚举不适合所有类型。我不确定,但我认为甚至不是double值。

编辑:谢谢aaa。我忘记了static关键字,当在c标头中声明常量时特别有用。 (在C ++中不需要静态)

答案 2 :(得分:5)

我个人更喜欢制作pi和c = 1并让宇宙处理问题

答案 3 :(得分:3)

由于枚举是整数常量,我会选择#define

我同意jdehaan全球const对象更好。

答案 4 :(得分:1)

同意jdehaan,更喜欢常量进行更明确的类型检查/转换。

此外,使用你所描述的枚举并不是枚举的真正目的。这些常数只是在数学上相关(如果宇宙学家hocus-pocus最终是正确的)。枚举的目的是组合相似的值,例如:

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