作者があちこちで次のイディオムを使用しているCコードに出くわしました。
typedef __int32 FOO_INT32;
#define FOO_INT32 FOO_INT32
これを行うポイントは何ですか?typedef で十分ではないでしょうか。それはいくつかの不安定なCコンパイラの回避策ですか?
作者があちこちで次のイディオムを使用しているCコードに出くわしました。
typedef __int32 FOO_INT32;
#define FOO_INT32 FOO_INT32
これを行うポイントは何ですか?typedef で十分ではないでしょうか。それはいくつかの不安定なCコンパイラの回避策ですか?
この#define
命令を使用すると、typedef がコード内の別の場所で実行されているかどうかを次のようにテストできます。
#ifdef FOO_INT32
FOO_INT32 myfoo;
#else
int myfoo;
#endif
これは、ヘッダーで時々行われるプラクティスです。#define を使用すると、typedef の存在をコンパイル時にテストできます。これにより、次のようなコードが可能になります。
#ifdef FOO_INT32
FOO_INT32 myfoo;
#else
int myfoo;
#endif
または、ヘッダー ファイル ガードと同様に、真のガード #define として。
#ifndef FOO_INT32
typedef int FOO_INT32
#define FOO_INT32 FOO_INT32
#endif
これは必ずしも良い方法ではありませんが、特に他のライブラリで定義された型を使用するヘッダーがいくつかある場合に使用されますが、それらのライブラリをまったく使用していない場合に独自の代替を提供したい場合は特にそうです。
このパターンは、この質問のように、マイクロプロセッサ内のレジスタの機能検出にも役立ちます。たとえば、2 つの同様のヘッダー ファイルがあり、そのうちの 1 つは 1 つのタイマーを定義し、もう 1 つは 2 を定義します。
cheapprocessor.h
:
#define TMR1 TMR1
extern volatile int TMR1;
expensiveprocessor.h
:
#define TMR1 TMR1
extern volatile int TMR1;
#define TMR2 TMR2
extern volatile int TMR2;
つまり、メイン コードにprocessor.h
、ターゲットの適切なヘッダーにデリゲートするジェネリックを含めると、機能を検出できます。
#include <processor.h>
#ifdef TMR2
x = TMR2;
#else
x = 0; // no timer, probably because we're on the cheaper model
#endif