バックグラウンド
マイクロコントローラーのコードでは、多くの定数が定義されているプロデューサーが提供するライブラリーを使用しています。一部の定数 (マイクロコントローラーの外部のコンポーネントと共有されている) とマイクロコントローラーの定数との間に不一致がある場合、エラーを発生させようとしていますgit-subtree
。
たとえば、ライブラリでは次のように定義されています。
#ifdef SOME_PARTICULAR_MODEL
#define FLASH_BLOCK_SIZE ((uint8_t)64)
/* else, other models */
#endif
そして、どこかで、マイクロコントローラー コードと PC でコンパイルされたコードの間で共有されるヘッダーに、たとえば次のようなものがあります。
#define MYPROG_BLOCK_SIZE 64
そして、これらの定数が一致することを確認するために、両方の定数が存在するマイクロコントローラー コードで、次のようにします。
#if MYPROG_BLOCK_SIZE != FLASH_BLOCK_SIZE
#error "mismatch between actual block size and defined block size"
#endif
これは、コードがより大きなマイクロコントローラーに移植された場合に、共有ヘッダーも更新されるようにするためです。
問題
問題は、これが次のように縮小されることです。
#if 64 != ((uint8_t)64)
有効なCかどうかはわかりませんが、それでもコンパイラを詰まらせます。uint8_t
テストの結果、問題はtypedefではなくint
、たとえばへのキャストで詰まることであることがわかりました。
質問
(uint8_t)
として定義された値からその部分を削除する方法はあり((uint8_t)64)
ますか? そうでない場合、表現がキャストなしのものになるように変更する方法はありますか?
uint8_t
何かとして定義して の後に未定義にすることを考えましたが、 のキャスト性を回避して算術式に変換する#if
方法がわかりません。(Y)X