9
typedef int A;
typedef int B;

void foo(A arg){}

void main(void){
    B wrongvar = 7;
    foo(wrongvar);
}

標準によれば、この構造は警告/エラーを返すはずですか? 最も人気のあるコンパイラはどうですか?

例: キログラムとメートルを表す変数があり、すべて「int」型です。メーターを処理する機能があります。キログラムを意味する変数変数をその関数に渡すことに関連するバグをコンパイラーにキャッチしてもらいたいのです。

Adaはそれをスムーズに処理してくれると思います。現代のCはどうですか?

4

2 に答える 2

9

いいえ、あなたが扱っているのは、構造的同等性と名前の同等性として知られる型規律の問題です。Dog が言ったように、目的を達成するためにできる最も近い方法は構造体を使用することですが、コンパイラがパディングを追加することを選択した場合、これはメモリの浪費になる可能性があります (この場合は可能性が低い)。C では、エイリアスに構造的等価性 (2 つの型が同じであることを意味します) を使用しますが、異なる宣言された構造体には名前の等価性を使用します (同じレイアウトを持つ 2 つの構造体型は等価として扱われません)。

これを行うために構造体を使用する例:

typedef struct {
    double value;
} meters;

typedef struct {
    double value;
} kilograms;

int main(){
    meters m;
    kilograms k = {2}; // initialized
    m.value = 1;
    k = m; // error, can't assign meters to kilos
    return 0;
}

この記事を読むことをお勧めします: http://www.joelonsoftware.com/articles/Wrong.html命名規則でこれらの問題を回避する方法を説明しています

于 2013-04-28T16:17:53.460 に答える
2

1 つのフィールドを持つ構造体を使用して、必要なことを正確に行うことができます。唯一の「欠点」は、オプティマイザーがそれらを最適化しない場合、1/2/4/8 バイトを無駄にする可能性があることです...

于 2013-04-05T12:03:59.780 に答える