私はスマート メーター プロジェクト、ARM、keil コンパイラに取り組んでいます。より複雑なロジックを g++ でコンパイルして、回帰テストを実行したいと考えています。購入した WMBus スタックへのインターフェイスを定義するいくつかのインクルード ファイルに問題があります。
PACKED_STRUCT( typedef struct S_WMBUS_ADDR_T
{
/*! Manufacturer ID */
uint8_t pc_manufr[WMBUS_ADDR_MANUFR_LEN];
/*! Ident number */
uint8_t pc_ident[WMBUS_ADDR_IDENT_LEN];
/*! Version */
uint8_t c_version;
/*! Type */
uint8_t c_type;
}, s_wmbus_addr_t);
PACKED_STRUCT は、コンパイラに依存するインクルード ファイルで定義されます。
#elif defined (__GNUC__)
#define PACKED_STRUCT(__declaration__, __name__) \
__declaration__ __attribute__ ((__packed__)) __name__
...
#elif defined(__arm__)
#ifdef __ARMCC_VERSION
#define PACKED_STRUCT(__declaration__, __name__) \
__packed __declaration__ __name__
そして、私は常に次のエラーメッセージを受け取ります:
エラー: タイプはパラメータタイプで定義されていない可能性があります
エラー: パラメータ宣言の typedef 宣言が無効です
インクルード ファイルを編集して PACKED_STRUCT を削除する以外に、これを回避する方法はありません。明らかに、ファイルを直接編集するのではなく、ファイルをコピーして編集し、-I ディレクティブを使用して、変更したファイルを G++ で見つけられるようにします。
エラーメッセージは、マクロの引数として型を宣言できないと言っているようですか?
再宣言しても注意してください:
#define PACKED_STRUCT(__declaration__, __name__) \
__declaration__ __name__
-std=c++11 フラグを g++ に使用していますが、このフラグを削除しても何も解決しませんが、システムのインクルードが失敗します
修正されていないコードを g++ でコンパイルするために PACKED_STRUCT を定義する方法はありますか?