2017-02-19 9 views
-3

:mylib.cでライブラリ内で構造体を使用するには? mylib.hで

typedef struct { 
    int len; 
    unsigned char *payload; /* payload len != len */ 
} packet; 

packet SEND_NUMBER; 
packet SEND_CHARACTER; 
/* and more */ 

SEND_NUMBER = { 
    5, 
    {0x01,0x02} 
} 

int a_function_which_handles_packet{ 
} 
/* and some other functions */ 

これは、エラーのために動作しません。

"この宣言は、何のストレージクラスや型の指定子がありません"

どのようにすべての(そして唯一の)ライブラリ関数がそれにアクセスできるような方法で構造体を整理できますか?

+0

あなたが質問をdownvoteする場合は、それがちょうど離れるのではなく、悪い質問だと思う少し理由を与えてください。これは私の意見では、このプラットフォームの最大の問題の1つです。たぶん私は私の質問を改善することができますが、あなたが私に何が間違っているか教えてくれないならば。 – Kntlii

+3

cファイルのみで構造体にアクセスする場合は、宣言をcファイルに入れます – Fredrik

+1

コード/エラーメッセージはあなたの質問と何が関係していますか? – melpomene

答えて

-1

Windowsはこれを "不透明な"構造で行います。彼らが本質的にやっていることは、実際の実装の詳細をユーザーから隠すことです。 .pdbファイルを使って実際の型をリバースエンジニアリングすることができれば、実際の構造体を型キャストしてそのフィールドにアクセスすることを防ぐことはできません。あなたは

typedef struct { 
    uint8_t reserved[sizeof(int)+sizeof(char*)] 
} packet; 

として

typedef struct { 
    int len; 
    unsigned char *payload; /* payload len != len */ 
} packet; 

として、独自のライブラリのコードでは、あなたの構造体を定義し、開発者にヘッダファイルを公開することができけれども、パディングは注意してください。構造体のサイズが同じであることを確認します。コンパイラのドキュメントを参照してデフォルトのパディングを確認するか、驚きを防ぐために1バイトに設定してください。

ちなみに、C11では複合リテラルを使用して必要なことを行うことができます。

SEND_NUMBER = (packet){ 
    5, 
    (unsigned char []){0x01,0x02} 
}; 
関連する問題