、あなたが確実の種類を判別することはできませんオブジェクト。したがって、ジェネリックプログラミングをサポートするためのメカニズムを導入する必要があります。情報を入力し保持する構造体のすべてのオブジェクトを囲む:
enum {type_int, type_double, type_string, /* ... */ } type_t;
struct {
type_t type;
void *obj;
} generic_type;
を今、あなたは((generic_type)my_object).type
を切り替えることができます。これはおそらくあなたが探しているものではありません。
しかし、マクロの引数が文字列リテラルまたは何か他のものであるかどうかを伝えるために簡単なトリックがあります。マクロは文字「#」を引用すると、あなたは文字列にマクロ引数を変えることができます:今、あなたは次の操作を行うことができます
#define DEBUG(x) if (#x[0] == '"') printf("%s\n", x); else printf("%d\n", x)
:下側に
DEBUG("foo bar"); // prints "foo bar"
DEBUG(23); // prints "23"
を、これはあなたをさせません例えば、 int
およびfloat
である。さらに、ポインタ・ツー・文字は文字列として認識されていません。いくつかのマシンで
char *foo = "bar";
DEBUG(foo); // prints the value of foo, not the string pointed to by foo
double salary;
DEBUG(salary); // prints (int)salary, not (double)salary
、sizeof(double) != sizeof(int)
。これはマクロ引数の異なる型をさらに区別するのに役立ちますが、確かに移植性がありません。
は、一般的に言って、あなたはまた、移植性を維持しながら、完全にジェネリックプログラミングのサポートに向けたいくつかの深刻な努力をせずにこの問題を解決することはできません。
私のアドバイス:書式指定子を使用するだけです。代わりに__VA_ARGS__
を使用しての
本当に 'endl'を使いたいですか?それはプログラムを本当に減速させるストリームのフラッシュを引き起こします。 –
補足として、関数のような形のマクロを書くときの標準的な習慣は、式全体にかっこを入れることです。 – Lundin
@mattieu:はい、彼は 'endl'を使っています:プログラムを遅くするためのデバッグで。そして、プログラムがそれを実行するときに、コンソール上の各行を見たいとします。フラッシングしないということは、あなたがたった今印刷したものを見ない*時には。それはデバッグを妨げる。 – towi