Matlab 全局常数。使用它们有问题吗?

Matlab 全局常数。使用它们有问题吗?,matlab,global-variables,constants,global,simulink,Matlab,Global Variables,Constants,Global,Simulink,我已经编程超过6年了,我一直避免使用全局变量,因为总是有另一种解决问题的方法 今天,我在一个(大)项目上工作,我们想使用一个数学常数的词汇表,它在任何地方都不会被修改。我在互联网上发现的关于globals的唯一问题是,如果有人覆盖了一个globals,它可能会破坏整个项目。但由于我的是常数,这个问题不适用 (为了避免人们创建与常量同名的变量,作为第二种安全措施,我可能会将它们全部打包到一个全局结构中) 有人知道使用全局常量仍然会发生的问题吗 谢谢你的回答!:) 在MATLAB中,数学常数的最佳选

我已经编程超过6年了,我一直避免使用全局变量,因为总是有另一种解决问题的方法

今天,我在一个(大)项目上工作,我们想使用一个数学常数的词汇表,它在任何地方都不会被修改。我在互联网上发现的关于globals的唯一问题是,如果有人覆盖了一个globals,它可能会破坏整个项目。但由于我的是常数,这个问题不适用

(为了避免人们创建与常量同名的变量,作为第二种安全措施,我可能会将它们全部打包到一个全局结构中)

有人知道使用全局常量仍然会发生的问题吗


谢谢你的回答!:)

在MATLAB中,数学常数的最佳选择是定义一个具有
常量属性的类。文档中对此进行了描述,下面是该页面的主要示例:

classdef NamedConst
   properties (Constant)
      R = pi/180
      D = 1/NamedConst.R
      AccCode = '0145968740001110202NPQ'
      RN = rand(5)
   end
end

这样,就不能覆盖这些值。(请注意,在这个示例中,有一点可能是出乎意料的-属性
RN
的值在每次加载类时都会更改!我个人不会编写这样的代码…

在MATLAB中创建常量的老式标准方法是。例如,它是一个函数。它可以写为:

函数值=pi
数值=3.14159;
结束

当然,我们可以在MATLAB中覆盖
pi
的值,但这始终是一个局部更改,不可能影响另一个工作区。

您如何知道没有人会在大项目中迷失方向,并在将来覆盖它?因为要编辑它,您必须按照“ConstantStictionNary.pi=5;”的行键入内容你不可能不意识到你正在重写常量。老实说,我不认为这样一个全局变量有什么问题,除了它可能会减慢使用它的代码的执行。据说MATLAB中的Globals会减慢JIT,因为它不能对值或类型进行假设。如果你想转换成C,这是一个没有实际意义的问题。谢谢你的回答!我在别的地方没有找到这样的解决办法,我会调查的。但关于我的项目的另一件事是,我将使用matlab编码器将代码生成C。为了避免matlab coder做它想做的事情,我想将一个包含常数的.h文件导入matlab,这样matlab coder将被迫完全按原样使用我的头文件。我知道可以使用头文件在matlab中导入全局变量。我还将研究在头文件中定义此类类并将其导入matlab的可能性,但如果你有答案,我洗耳恭听!)经过测试,结果表明,类对象是不可扩展的,因为Matlab编码器使用C语言,类是C++特征,这是从我收集的源代码中找到的最好的解决方案。类解决方案本来不错,但MATLAB编码器使用C代码,不承认C++类概念。我计划实现它的方式是``函数值=常量值=结构(…“constant1”,1,…“pi”,3.14159265358979323,…“constant2”,8);结束``在考虑了这个解决方案之后,这意味着每次我想使用常量时都必须调用该函数,这对处理时间非常不利。因此,我现在正在寻找一种在matlab/simulink中使用头文件的方法,并使用我自己创建的头文件生成代码,但似乎不可能在头文件中设置常量并将其导入matlab。我会不断向你们介绍我的研究成果!如果有人有线索,请务必发表评论@胡德:我不会担心处理时间的问题,除非你试过并计时。我相当确信JIT优化了函数调用,并且期望MATLAB编码器也能做到类似的事情。我没有MATLAB编码器的经验,到目前为止只使用了另一个C代码生成器。我的方法是强制内联函数。我相信MATLAB编码器也有类似的选择。