【问题标题】:Define replacement with Constant variable issue用常量变量问题定义替换
【发布时间】:2013-07-26 11:15:47
【问题描述】:

我正在创建一个组件,一个模板的泛化。创建时必须使用字符串标识符。

我正在替换:

#define MYCOMPONENT_CONSTANT_IDENTIFIER        "ID value"

namespace myComponent
{
    static const QString constant_identifier = "ID value"
}

遵循一些编码标准(MISRA,...)。

这应该适用于 C++。我在Constants-only header file C++ 进行了检查。

此常量在组件“myComponent”的标题中定义,并包含在初始化我的索引器和创建组件的标题中。这在更换时没有更改。

替换构建成功,但尝试运行失败。 分段错误发生在:

template<>
inline void TMyIndexer::Init()
{
  Map(...)
  //before
  //Map( ENUM_VAL, QSharedPointer<ITableFieldDefs>(new myComponent::TTableFieldDefs(MYCOMPONENT_CONSTANT_IDENTIFIER)) );
  Map( ENUM_VAL, QSharedPointer<ITableFieldDefs>(new myComponent::TTableFieldDefs(myComponent::constant_identifier)) );
  Map(...)
}

地点:

// TStaticFieldDefs<> implements ITableFieldDefs
typedef TStaticFieldDefs<myComponent::Fields> TTableFieldDefs;

//constructor
TStaticFieldDefs(QString id) : fId(id) {}

如果我上栈:

2.) qstring.h: 内联 QString::QString(const QString &other) : d(other.d) { Q_ASSERT(&other != this); d->ref.ref(); }

1.) qatomic_x86_64.h: inline bool QBasicAtomicInt::ref()

我认为模板泛化、构造函数中的内联定义或其他我不知道的地方有问题。

欢迎任何解释。

我没有想法,恳请帮助。

【问题讨论】:

  • 您是否尝试过完全重建?也许也可以通过手动删除任何临时文件夹/文件然后重建?修复了我迄今为止遇到的 90% 的分段错误
  • 是的,我做到了。完全清理和重建。我已经更新了描述。
  • 我将尝试在一个更微不足道的情况下进行检查。 Timthanx 的回应。

标签: c++ qt templates header constants


【解决方案1】:

我的猜测是您正在尝试从静态上下文中使用常量对象。 C++ 标准规定静态对象初始化的顺序是未定义的。因此,您可能会引用可能导致段错误的未初始化对象。

【讨论】:

  • 猜得好。可能就是这样。我怀疑常量是从静态上下文中使用的,但常量本身是一个静态的并且可能未初始化。这也解释了不断调用的分段错误。我会检查它并尝试用link answer建议的功能替换它。
  • 有效。我用static const QString constant_identifier() {return "ID value";} 替换了static const QString constant_identifier = "ID value" 并且效果很好。似乎内联定义和常量变量不匹配。
  • 我很高兴它有效。在我的实践中,我从未见过内联定义和不断的冲突。你能告诉我,你是怎么调用 TMyIndexer::Init() 的吗?
  • 你是对的,我的深度不够。 TMyIndexer::Init() 在单例实现中通过静态对象调用。所以你的答案是完美的猜测。谢谢你的另一个问题。
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 2017-09-22
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多