【FMU】最小構成のMBD事例 第2章 その48【FMILibrary⑤】

【FMU】最小構成のMBD事例 第2章 その48【FMILibrary⑤】 事例
【FMU】最小構成のMBD事例 第2章 その48【FMILibrary⑤】

バックナンバーはこちら。
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言語のケアが薄いためなのかもしれない。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました