为什么使用静态"constants"而不是实际值?
why use static "constants" instead of the actual value?
我正在寻找一种至少方形方法的代码,我遇到了以下几行:
static double one = 1.0;
static double p1 = 0.1;
static double p5 = 0.5;
...
我想知道为什么有人会为1.0
定义static
。例如,我可以理解为pi
有一些东西,但是对于1.0
和0.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是一种代码气味。没有其他目的。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 为什么虚函数不能是静态的和全局的?
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 为什么使用静态"constants"而不是实际值?