2

私のコードは、簡単に混乱するさまざまなものを表すスカラー型へのポインターを渡します。コンパイラがこれを助けてくれると思いました。

テストプログラムは次のとおりです。

typedef int type_a;
typedef int type_b;

type_a do_something_with_a(type_a* pa)
{
    return *pa + 3;
}

int main(void)
{
    type_b b = 0;
    do_something_with_a(&b);  /* This is a bug. */
    return 0;
}

Asでのみ処理を行うことになっている関数にBを渡していますが、gccは警告をスローしません。

$ gcc -Wall typesafe2.c 
$ 

同等のコードを書くことができるエレガントな方法はありますが、そのようなひどい間違いをしたときにコンパイラーにエラーをスローさせますか?

4

4 に答える 4

3

typedef新しいタイプを定義するのではなく、既存のタイプのエイリアスを定義します。どちらのタイプもintなので、バグはありません。ここを参照してください。

于 2013-03-04T12:06:36.600 に答える
3

typedef int type_a;などの代わりに、typedef struct { int value; } type_a;

于 2013-03-04T12:07:39.303 に答える
2

標準によれば、typedefは同義語です。

C99§6.7.8、p3:

ストレージクラス指定子がtypedefである宣言では、各宣言子は、6.7.6で説明されている方法で識別子に指定されたタイプを示すtypedef名として識別子を定義します。可変長配列宣言子に関連付けられている配列サイズ式は、実行順にtypedef名の宣言に到達するたびに評価されます。typedef宣言は新しい型を導入せず、そのように指定された型の同義語のみを導入します。つまり、次の宣言では次のようになります。

typedef T type_ident;
type_ident D;

type_identは、Tの宣言指定子(Tと呼ばれる)で指定された型のtypedef名として定義され、Dの識別子の型は''派生宣言子-type-listT''です。ここで、派生宣言子-type- listは、Dの宣言子によって指定されます。typedef名は、通常の宣言子で宣言されている他の識別子と同じ名前空間を共有します。

したがって、ドリルスルーする一意の型(個別の構造型など)を宣言しない限り、必要なものが得られない可能性があります。

于 2013-03-04T12:14:14.370 に答える
0

基本データ型でtypedefを使用する代わりに...structtypeを使用

例えば

typedef struct { int a; } type_1;
typedef struct { int b; } type_2;

これはおそらく問題を解決し、コンパイラは警告/エラーをスローします

于 2013-03-04T13:04:25.927 に答える