私が見た効果的な方法の1つは、マクロ(よく嫌われるツール)を使用することです。#_name
マクロには、作業をはるかに楽にするのに役立つ2つの機能があります。パラメータを文字列に変換できるシングルハッシュ「#」と、"fieldName1"
パラメータを他のものと連結できるダブルハッシュ「##」です。新しいものを拡張します。つまりSTRUCT_##_type##_str
、次のように変換さSTRUCT_int_str
れます。"%d"
まず、構造体または「説明」をマクロでラップします。つまり、独自のファイル(the-struct.def)にラップします。
STRUCT_BEGIN(s_my_struct)
STRUCT_FIELD(int, fieldName1)
STRUCT_FIELD(int, fieldName2)
STRUCT_FIELD(int, fieldName3)
STRUCT_END(s_my_struct)
// Note that you can add more structs here and all will automatically get defined and get the print function implemented
次に、構造体を処理する必要があるものを宣言または実装する場所で、マクロを異なる方法で定義できます。すなわち
#define STRUCT_BEGIN(_name) struct _name {
#define STRUCT_END(_name) };
#define STRUCT_FIELD(_type, _name) _type _name;
#include "the-struct.def"
// then undef them
#undef STRUCT_BEGIN
#undef STRUCT_END
#undef STRUCT_FIELD
構造体を出力する関数を作成します
#define STRUCT_BEGIN(_name) void print_ ## _name(struct _name *s) {
#define STRUCT_END(_name) }
#define STRUCT_FIELD(_type, _name) printf("%s = " STRUCT_##_type##_str "\n", #_name, s->_name);
#define STRUCT_int_str "%d" /* this is to output an int */
// add more types...
#include "the-struct.def"
// then undef them
#undef STRUCT_BEGIN
#undef STRUCT_END
#undef STRUCT_FIELD
#undef STRUCT_int_str
他の用途としては、関数を自動生成してバイトをスワップするなどがあります。
ここで要点として小さな例を作成しましたhttps://gist.github.com/3786323