バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はFMILibraryのビルドを始めたところ。
しかし、xmlparse.cでエラーが発生し、ビルドが失敗してしまった。
とりあえず、フクさんが原因究明をすることにはなったが・・・。
原因調査結果と対策について。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
ビルドエラーの原因
で、ビルドエラーの原因は分かった?
まぁ一応分かったが・・・。
結局なんだったの?
offsetofという構造体のメンバ変数のオフセット値を取得できるマクロ関数があるんだが、これの定義の仕方と言うか、定義されてなかった?
って感じ。
offsetof?
offsetof
offsetofは・・・Wikipediaから引用しよう。
英語版しかなかったけど。
C’s offsetof() macro is an ANSI C library feature found in stddef.h. It evaluates to the offset (in bytes) of a given member within a struct or union type, an expression of type size_t. The offsetof() macro takes two parameters, the first being a structure name, and the second being the name of a member within the structure. It cannot be described as a C prototype.
Wikipediaより(https://en.wikipedia.org/wiki/Offsetof)
↓日本語訳
Cのoffsetof()マクロは、stddef.hにあるANSI Cライブラリの機能です。このマクロは、構造体やユニオン型、size_t型の式の中で、指定されたメンバーのオフセット(バイト単位)として評価されます。offsetof() マクロは 2 つのパラメータを取ります。1 つ目は構造体名、2 つ目は構造体内のメンバの名前です。C言語のプロトタイプとしては記述できない。
まぁC言語の標準的なライブラリにoffsetofってのがあるってことだけわかった。
それが、Windows SDKの中になかった・・・。
え?!そんなことってあるの???!!!!
厳密に言うと、C++としてビルドする場合はあるんだけど、C言語としてビルドする宣言されてないことになってる・・・。
意味がわからん。
vs2017 SDKのstddef.h
まぁコード見た方が早いかな。
#if defined _MSC_VER && !defined _CRT_USE_BUILTIN_OFFSETOF
#ifdef __cplusplus
#define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
#else
//#define offsetof(s,m) ((size_t)&(((s*)0)->m))
#endif
#else
#define offsetof(s,m) __builtin_offsetof(s,m)
#endif
ポイントは
#ifdef __cplusplus
のところ。
__cplusplusはC++の場合に定義されるもので、
今回のxmlparse.cに於いてはC言語なので定義されていない。
え?!
ということは#else側に行って・・・。
offsetofがコメントアウトされてる?!!!
そうなるね。
これはどうしたら・・・。
stddef.hを修正するわけにはいかないから、
xmlparse.cの先頭で以下を定義だな。
#define offsetof(s, mem) (size_t)&(((s *)0) -> mem)
まぁそうするしかないのだろうけど、
なぜこんなことに・・・。
他のversionのSDKでは治ってるっぽいから、たまたま運が悪かった。
ってことになるのかなー。
まぁVisual Studio自体がC++を想定した環境だからねー。
C言語側のケアはやや薄いのかもねー。
でも、これでビルドが通ると。
たぶん?
(うーん、大丈夫なのだろうか・・・。)
まとめ
まとめだよ。
- FMILibraryのビルドエラーの原因究明。
- stddef.hにoffsetofが定義されていなかった。
- 厳密にはC++向けには定義されていたが、C言語向けには定義されていなかった。
- Visual Studio自体がC++を想定した環境であるためC言語のケアが薄いためなのかもしれない。
バックナンバーはこちら。
コメント