1

私はスマート メーター プロジェクト、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 を定義する方法はありますか?

4

1 に答える 1

0

@LPその通りですが、今のところ理由はわかりません。このコードはコンパイルされます: 私は間違ったインクルード ファイルが何らかの形ですり抜けているに違いありません。

typedef unsigned char uint8_t;
#define WMBUS_ADDR_MANUFR_LEN 4
#define WMBUS_ADDR_IDENT_LEN 4

#define PACKED_STRUCT(__declaration__, __name__) \
  __declaration__ __attribute__ ((__packed__)) __name__

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);

s_wmbus_addr_t hello;
于 2016-08-02T09:20:49.873 に答える