簡體   English   中英

我如何讓gcc告訴我我傳遞了錯誤的標量類型?

[英]How do I get gcc to tell me I am passing the wrong scalar type?

我的代碼傳遞指向標量類型的指針,這些標量類型代表容易混淆的不同事物。 我認為編譯器可以幫助我。

這是一個測試程序:

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;
}

我正在將一個B傳遞給一個只能用As做事的函數,但是gcc甚至沒有發出警告:

$ gcc -Wall typesafe2.c 
$ 

有沒有一種優雅的方式我可以編寫相同的代碼,但是當我犯下如此可怕的錯誤時,編譯器會拋出錯誤?

typedef不定義新類型,而是定義現有類型的別名。 因為你的兩個類型都是int,所以沒有bug! 看到這里

而不是typedef int type_a; 等,使用typedef struct { int value; } type_a; typedef struct { int value; } type_a;

根據標准,您的typedef是同義詞:

C99§6.7.8,p3:

在存儲類說明符為typedef的聲明中,每個聲明符都將標識符定義為typedef名稱,該名稱表示以6.7.6中描述的方式為標識符指定的類型。 每次按執行順序達到typedef名稱的聲明時,將評估與可變長度數組聲明符關聯的任何數組大小表達式。 typedef聲明不引入新類型,只引用所指定類型的同義詞。 也就是說,在以下聲明中:

 typedef T type_ident; type_ident D; 

type_ident被定義為typedef名稱,其類型由T中的聲明說明符指定(稱為T),D中的標識符具有類型''derived-declarator- type-list T'',其中derived-declarator-type -list由D的聲明符指定.typedef名稱與普通聲明符中聲明的其他標識符共享相同的名稱空間。

所以,除非你聲明的獨特類型鑽透 (如不同的結構類型),你可能不會得到你想要的東西。

而不是在基本數據類型上使用typedef ...使用struct type

例如

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

這可能會解決問題,編譯器會拋出警告/錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM