2014-08-29 63 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。