我可以在运行时重新定义 OpenCascade/OCCT header 中定义的 C++ static const 吗?

Can I redefine a c++ static const defined in a OpenCascade/OCCT header at runtime?

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

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

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

如果您想使用这个常量来影响您的代码和 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 中的数据交换组件支持 export/import 步的长度单位转换。

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