0

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

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

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

4

1 回答 1

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()根本不会影响此类算法,以防万一您的模型以某种方式损坏(编码太大的容差值以覆盖几何错误定义)。

于 2020-06-27T09:24:00.147 回答