0

良い一日。問題は次のとおりです。次のコードを使用して解析しようとする有効な *.xml ファイルがあります。

for(XMLSize_t i = 0; i < childrenNodeCount; ++i)
{
  DOMNode* currentNode = children->item(i);

  if ((currentNode->getNodeType() != 0) && (currentNode->getNodeType() == DOMNode::ELEMENT_NODE))
  {
    DOMElement* currentElement = dynamic_cast<xercesc::DOMElement*>(currentNode); // !!!

    if (XMLString::equals(currentElement->getTagName(), TAG_SectionHeader))
    {
      // parse this part
    }

    if (XMLString::equals(currentElement->getTagName(), TAG_SectionBody))
    {
      // parse this part
    }
  }
}

最初の「equals」チェックで SIGILL を使用して実行中にプログラムがクラッシュします。デバッグは、動的キャストの後、currentElement が実際にはヌル ポインターであることを示しました。ここで何が問題になる可能性がありますか?

xlc++、Xerces ライブラリ 2.5、AIX 7 でコンパイル。

PS 同じコードが Windows でも正常に動作するようです。

更新: dynamic_cast を static_cast に変更すると、コードがエラーなしで実行されました。しかし、それはいくつかの疑問を未解決のままにしました。

1) Windows では dynamic_cast を使用しているのに、Unix では使用していないときにコードがエラーなしで実行されたのはなぜですか? コンパイラまたはライブラリのバージョンの問題でしょうか?

2) この場合、キャストするためのより良い/よりクリーンな方法はありますか?

4

2 に答える 2

0

わかりました。理由は次のとおりです。Xerces ライブラリは、デフォルトでは RTTI が有効な状態でビルドされていません。OP の仕組みを機能させるには、RTTI を有効にしてライブラリを再構築する必要があります。https://issues.apache.org/jira/browse/XERCESC-819

于 2015-08-21T13:22:12.017 に答える