我想知道在整个程序中使用的数学常量的最佳存储方法是什么?
#define PI 3.14159265
#define SPEEDOFLIGHT 2.99792458e8
或
enum constants { PI = 3.14159265; SPEEDOFLIGHT = 2.99792458e8; }
由于
答案 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;
}