为什么使用静态"constants"而不是实际值?

why use static "constants" instead of the actual value?

本文关键字:静态 constants 为什么      更新时间:2023-10-16

我正在寻找一种至少方形方法的代码,我遇到了以下几行:

static double one = 1.0;
static double p1 = 0.1;
static double p5 = 0.5;
...

我想知道为什么有人会为1.0定义static。例如,我可以理解为pi有一些东西,但是对于1.00.1等琐碎的数学值等?我认为这会使代码不那么可读,但是它可能会带来我缺少的其他好处。

那么,这些定义是否有原因?或者,如果不与现代代码一起使用,是否有任何理由与旧编译器一起使用?我知道我正在查看的代码被转化为Fortran的C/C 。在Fortran中有任何原因吗?

我知道我正在查看的代码已将其转换为C/C Fortran。有什么原因在Fortran中吗?

fortran使用所有子例程参数使用通过传递。但是,与其他具有通过传递的语言不同,它仍然可以使您将" rvalues"作为参数传递。幕后,Fortran编译器将代码转换为:

CALL SUBFOO(X + Y, 4)

之类的代码
TEMP1 = X + Y
TEMP2 = 4
CALL SUBFOO(TEMP1, TEMP2)

这正是您的C 代码所做的:创建变量以将指针(或参考)传递给子例程fortran风格。

当然,这不是惯用的C或C 。通常,您会通过value 。

通过 double

(从我对此问题的回答复制的代码样本。)

使用

static double one = 1.0;
static double p1 = 0.1;
static double p5 = 0.5;

对我来说没什么意义。如果变量以更有意义的内容命名,那将是有意义的。我看到了类似的价值:

static double defaultCoefficient = 1.0;
static double defaultRateOfIncrease = 0.1;
static double defaultRatio = 0.5;

在第二组中,代码中变量的使用比使用相应的常数更有意义。

使它们稳定会更有意义。

static double const defaultCoefficient = 1.0;
static double const defaultRateOfIncrease = 0.1;
static double const defaultRatio = 0.5;

我知道我正在查看的代码被翻译成Fortran的C/C 。

如果翻译是通过程序完成的,那么可以理解的是,为什么变量以其方式命名。

如果翻译是由人类完成的,他们可能遵循了一些有关如何快速移动事物的指南,而不一定通过理解代码来创建有意义的变量名称。

我看到此使用的一种情况是在某些(较旧的,嵌入式的)平台上使用哈佛建筑。

说我有一个(外部库)功能,该功能将指针作为参数:

void Foo(double *Bar);

如果我想将常数传递给此函数,我显然不能直接编写它。我必须像在开头文章中一样这样做,以便以one的地址为例。

Foo(&one);

在某些哈佛平台上,const值放在程序ROM或闪存中而不是RAM中,因此您将无法使用ROM地址而不是所需的RAM地址,这将无法正常工作。

然后完成一个全局(静态)变量,以便每次将其作为自动变量来初始化一次启动代码(从ROM到RAM复制的值一次)。

我承认的利基用例。

no,那个常数很愚蠢。如果出于以外没有其他原因,它实际上不是常数

实际上有一个很好的理由,它涉及软件开发过程本身。

假设您有一个翻译单元,可以使用一些数字参数调用某些功能,自然而然地使其成为常数:

static const double epsilon = 1.e-3;

不错的,干净的代码。但是现在您意识到,您设定的Epsilon并不那么好,您需要一个更好的选择。您实际上没有确定应该是什么的确定方法,因此您要进行一些反复试验:

static const double epsilon = 1.e-4;

您重建程序。而且它仍然不好。如果您再次更改它,则必须等待构建完成,并且在某些非平凡项目中可能需要一段时间。该怎么办?

好吧,调试者让您更改变量的价值,只要它们驻留在内存中(而不是像真正的常数那样消除)。因此,我们执行以下操作:

static double epsilon = 1.e-4;

现在,我们在该文件中的某个地方设置了一个断点。我们可以在不每次重新构建程序的情况下修改epsilon。我们最终节省了宝贵的发展时间。我们会立即找到适当的价值。

我们是否将其保留非const?否。这是一个常数,因此在检查我们的代码之前,我们将其标记为const。将其放置在非const是一种代码气味。没有其他目的。