【问题标题】:Can I redefine a c++ static const defined in a OpenCascade/OCCT header at runtime?我可以在运行时重新定义 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
【发布时间】:2020-06-27 04:28:12
【问题描述】:

也许这很简单,但我想在库头中动态地重新定义一个常量集,这样我就不必在每次更改它时都重新编译它。在 OpenCascade 的 Precision.hxx 中,常量“Precision::Confusion”被定义为:

class Precision 
{
public:
...
  static Standard_Real Confusion() { return 1.e-7; }
...
}

是否可以在运行时在 (c++) 函数中重新定义它?

【问题讨论】:

    标签: c++ header redefine opencascade


    【解决方案1】:

    如果您想使用这个常量来影响您的代码和 OCCT 本身的所有内容,而不需要重新编译使用它的每段代码,您可以将常量的定义移动到 .cxx 文件中。

    // Precision.hxx
    class Precision
    {
    public:
    ...
      Standard_EXPORT static Standard_Real Confusion();
    ...
    }
    
    // Precision.cxx
    Standard_Real Precision::Confusion() { return 1.e-7; }
    
    // FILES
    Precision.hxx
    Precision.cxx
    

    在这种情况下,你需要在修改常量后重新构建TKMath.dll动态库。

    将此类常量移动到导出函数中可能会对 OCCT 算法的性能产生负面影响,因为需要额外的函数调用,并且无法进行编译器优化。

    另一个问题是,某些 OCCT 算法在更改 Precision::Confusion() 值后实际上可能会由于与其中的其他数字常量组合而变得损坏/不稳定/变慢。

    如果您发现 Precision::Confusion() 对您的计算来说过于粗糙 - 请考虑以其他长度单位使用您的模型,而不是更改全局常数(例如,从米切换到毫米或从毫米切换到微米)。 OCCT 中的数据交换组件支持导出/导入步骤中的长度单位转换。

    还要注意Precision::Confusion() 仅定义了 3D 空间中的较低/默认精度值。使用拓扑时,形状级别的公差值将用于扩大算法公差,因此更改 Precision::Confusion() 根本不会影响此类算法,以防万一您的模型以某种方式损坏(编码太大的公差值以覆盖几何错误定义)。

    【讨论】:

    • 谢谢,我真的很感激这个答案,因为它解决了我需要知道的并且没有明确提出的问题(它很可能会更好,所以缩放对象而不是重新定义 OCCT 内部参数)。
    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 2018-12-10
    • 2014-03-24
    • 2011-02-06
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多