スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
このエントリーをはてなブックマークに追加

[iOS][C/C++]構造体のポインターは見苦しい

今回はlibxml2というSAX(Simple Api for Xml)を利用しようとして起きた問題です。

このlibxml2にはxmlSAXHandlerPtrなるものが用意されていて、

どうなってるかというと

typedef struct _xmlSAXHandler xmlSAXHandler;
typedef xmlSAXHandler *xmlSAXHandlerPtr;


となっていて、結局は_xmlSAXHandlerを表していることになる。

そして「これがどうしたんだ?」ということなのですが、
まず次の代入式を見てほしい。


xmlSAXHandler saxh;
saxh.startElementNs = startElementSAX;

xmlSAXHandlerPtr sax;
sax.startElementNs = startElementSAX;


これは関数startElementSAX()をxmlSAXHandlerの構造体要素startElementNsへ突っ込もうとしているところです。
startElementNsとは関数ポインタというものです。

問題は、このアクセスがどちらも同じに見えることです。
しかし後者だけはどうしてもエラーを吐いてしまいます。
どうも宣言の違いによるもので、後者だけは構造体として扱ってもらえない。

この場合は構造体まるっとまんま作って渡すしかなさそうです。
もっとスマートにならなかったんだろうか・・・。

ちなみに
こいつのまるっとまんまの構造体を作るとどうなるかというのは追記に書いておきます。長いので。

static xmlSAXHandler simpleSAXHandlerStruct = {
NULL, /* internalSubset */
NULL, /* isStandalone */
NULL, /* hasInternalSubset */
NULL, /* hasExternalSubset */
NULL, /* resolveEntity */
NULL, /* getEntity */
NULL, /* entityDecl */
NULL, /* notationDecl */
NULL, /* attributeDecl */
NULL, /* elementDecl */
NULL, /* unparsedEntityDecl */
NULL, /* setDocumentLocator */
NULL, /* startDocument */
NULL, /* endDocument */
NULL, /* startElement*/
NULL, /* endElement */
NULL, /* reference */
charactersFoundSAX, /* characters */
NULL, /* ignorableWhitespace */
NULL, /* processingInstruction */
NULL, /* comment */
NULL, /* warning */
NULL, /* error */
NULL, /* fatalError //: unused error() get all the errors */
NULL, /* getParameterEntity */
NULL, /* cdataBlock */
NULL, /* externalSubset */
XML_SAX2_MAGIC, //
NULL,
startElementSAX, /* startElementNs */
endElementSAX, /* endElementNs */
NULL, /* serror */
};

こんなもん書いてられるかハゲェェェェェ!!?
このエントリーをはてなブックマークに追加

コメントの投稿

非公開コメント

Translation


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
プロフィール

チーズくん

Author:チーズくん
個人的メモをただ羅列しています。
twitter:@cheese1038

バロメーター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。