4

これを行う方法が見つかりませんが、GCC / LLVMのコンパイラフラグがあり、これについて警告することができます。

typedef float distance_feet_t;
typedef float distance_meters_t;

void shouldWarnMe ( void )
{
    distance_feet_t feet = 10.0f;
    distance_meters_t meters = 20.0f;

    /* this should generate a warning */
    distance_meters_t total = meters + feet;
}

本質的には、変数の型を再定義して、それらを混合し始めると、コンパイラがキャストが欠落していることを警告するようにします。

私は試しました-壁:警告なし。

typedefを使用せずにこの問題を解決する方法があります。しかし、問題は、説明されているようにtypedefでそれを行う方法はありますか?

4

3 に答える 3

3

いいえ。コンパイラに関する限り、distance_feet_tdistance_meters_tまったく同じタイプです。純粋なCでこれを行う方法はわかりませんが、異なるユニットタイプごとにクラスを定義し、適切なオーバーロードされた演算子を定義することで、C ++で確実に行うことができます(ただし、そこには多くの厄介な定型文があります)。

補足:接尾辞で終わるグローバルスコープの識別子は_t、POSIX標準によって予約されていると見なされます。競合の可能性はかなり低いですが(発生した場合は簡単に修正できます)、このような識別子の使用は避けることをお勧めします。

于 2012-10-17T21:17:25.767 に答える
2

「クリーンな」方法はありませんが、いくつかのトリックがあります。

Cで強い型チェックを実施する(typedefの型の厳密さ)

本当にやらなければならない場合は、通常、structトリックを使用します。それ以外の場合は、lintを使用します。

于 2012-10-17T21:34:10.830 に答える
1

typedef新しいタイプは作成しませんが、既存のタイプのエイリアスを作成します。

その意味は:

typedef float distance_feet_t;
typedef float distance_meters_t;

floatdistance_feet_tおよびdistance_meters_tは、まったく同じタイプの異なる名前です。

于 2012-10-17T21:18:12.100 に答える