2014-08-29 59 views
1

我在做一些Linux網絡編程的時刻,爲了這個,我自己做了便攜我應該在庫調用中使用我自己的typedefs嗎?

typedef char int8; 
typedef unsigned char uint8; 

typedef short int16; 
typedef unsigned short uint16; 

typedef int int32; 
typedef unsigned int uint32; 

現在我在一個地步,我想要寫一個經常使用的插座一些包裝功能的一些typdefs功能。一個簡短的例子是:

int32 rawSocketCreate(int* sockfd, int protocol) { 

    *sockfd = socket(AF_PACKET, SOCK_RAW, htons(protocol)); 

    if (*sockfd == -1) { 
     printf("Error creating raw socket\n"); 
     return -1; 
    } 

    return 0; 
} 

我現在的問題是:對於我的參數傳遞給庫函數,我應該繼續使用標準數據類型或者還用我自己的?

rawSocketCreate(int* sockfd, int protocol) 
/* OR */ 
rawSocketCreate(int32* sockfd, int32 protocol) 
+0

你還好吧(意思是你自己)。因爲你用標準類型輸入它。 – 2014-08-29 08:46:30

回答

6

ç忌諱......有什麼不對<stdint.h>標準的typedef它提供?似乎每個人都用自己發明的類型定義的,但幾乎沒有人似乎使用的標準包括:(附帶適當的宏printf()scanf()處理等)......


如果API調用預期int,你應該通過int,沒有對所說的int(因爲假設傾向於在最不幸的時刻打破)的原生寬度的假設。

如果確切寬度僅限於,則使用定義寬度typedefs。 (對於結構佈局的例子跨平臺的二進制兼容性,硬件驅動程序,...)

+0

請注意:我很清楚爲什麼沒有人似乎在使用'',但是我不能在微軟和他們的編譯器維護的想法上採取另一種方式,因爲......忘記它了,無論如何我都怪他們。 ;-) – DevSolar 2014-08-29 08:52:56

+0

你能解釋一下爲什麼你「非常清楚爲什麼沒有人似乎使用stdint.h」。它有缺點嗎? – happyMOOyear 2014-08-29 08:56:27

+1

@happyMOOyear:[MSVC不附帶,你必須下載/供應你自己的](http://stackoverflow.com/questions/126279)。 MS支持直接引用:「C99合規對我們來說不是優先考慮的問題」。那是從2008年左右開始的。(目前他們正在以同樣傲慢的方式處理C++ 11.)微軟對API鎖定非常滿意。沒有理由不使用標題,但這是很多人甚至沒有意識到它的存在的原因。 – DevSolar 2014-08-29 09:07:34

2

你應該使用自己的typedef,因爲標準<stdint.h>頭提供了一個更好的選擇 - 因爲它是標準的。

您應該不是將您自己的類型傳遞給標準函數的包裝器,因爲這違背了使用自己的類型以實現可移植性的目的。例如一個文件描述符是int,你不應該認爲它是一個int32。

2

當你typedef的基本類型,你想增強你的代碼的可移植性。 在代碼中將平臺依賴類型(int)與typedef類型(int32)混合是不一致的。如果你這樣做,那麼你的代碼仍然依賴於平臺。

此外,我建議你看看stdint.h文件已經包含所有這些定義。

希望這會有所幫助。

Carles。