C 我应该在库调用中使用自己的typedef吗?

C 我应该在库调用中使用自己的typedef吗?,c,typedef,function-calls,C,Typedef,Function Calls,我现在正在用Linux做一些网络编程,为此我为自己制作了一些TypeDef,以便于移植 typedef char int8; typedef unsigned char uint8; typedef short int16; typedef unsigned short uint16; typedef int int32; typedef unsigned int uint32; 现在我想为常用的套接字函数编写一些包装函数。一个简单的例子是: int32 rawSocketCreate(i

我现在正在用Linux做一些网络编程,为此我为自己制作了一些TypeDef,以便于移植

typedef char int8;
typedef unsigned char uint8;

typedef short int16;
typedef unsigned short uint16;

typedef int int32;
typedef unsigned int uint32;
现在我想为常用的套接字函数编写一些包装函数。一个简单的例子是:

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)

C宠物脾气。。。它提供的标准类型定义有什么问题?每个人似乎都使用自己发明的typedef,但实际上似乎没有人使用标准include(它带有适当的宏,用于
printf()
scanf()
处理等)


如果一个API调用需要一个
int
,那么您应该向它传递一个
int
,而不必假设所述
int
的本机宽度(因为假设往往在最不幸的时刻中断)


仅当确切宽度重要时,才使用定义的宽度typedef。(例如结构布局、硬件驱动程序等的跨平台二进制兼容性)

C宠物皮。。。它提供的标准类型定义有什么问题?每个人似乎都使用自己发明的typedef,但实际上似乎没有人使用标准include(它带有适当的宏,用于
printf()
scanf()
处理等)


如果一个API调用需要一个
int
,那么您应该向它传递一个
int
,而不必假设所述
int
的本机宽度(因为假设往往在最不幸的时刻中断)


仅当确切宽度重要时,才使用定义的宽度typedef。(例如结构布局、硬件驱动程序等的跨平台二进制兼容性)

您不应该使用自己的typedef,因为标准的
头提供了更好的选择,因为它是标准的


您应该而不是将您自己的类型传递给围绕标准函数的包装器,因为出于可移植性的原因,这样做违背了使用您自己的类型的目的。e、 g.文件描述符是一个
int
,您不应该假设它是一个int32。

您应该使用您自己的typedef,因为标准
头提供了一个更好的选择-因为它是标准的


您应该而不是将您自己的类型传递给围绕标准函数的包装器,因为出于可移植性的原因,这样做违背了使用您自己的类型的目的。e、 g.文件描述符是一个
int
,您不应该假设它是一个int32。

当您键入def基本类型时,您希望增强代码的可移植性。 在代码中混合平台相关类型(int)和typedef类型(int32)是不一致的。如果这样做,那么代码仍然依赖于平台

此外,我建议您查看stdint.h文件,它已经包含了所有这些定义

希望这有帮助


Carles.

当您键入定义基本类型时,您希望增强代码的可移植性。 在代码中混合平台相关类型(int)和typedef类型(int32)是不一致的。如果这样做,那么代码仍然依赖于平台

此外,我建议您查看stdint.h文件,它已经包含了所有这些定义

希望这有帮助


Carles.

你可以接受(指你自己的)。因为你用标准字体来定义它。你可以用它(意思是你自己的)。因为你用标准类型来定义它。请注意:我很清楚为什么似乎没有人在使用
,但我不能再次抨击微软和他们的编译器维护想法,因为。。。算了吧,反正我都怪他们你能解释一下为什么你“非常清楚为什么没有人使用stdint.h”吗。它有缺点吗?@HappyMoyear:。直接引用MS支持:“C99合规性不是我们的优先事项”。那是2008年左右的。(目前他们正在以同样傲慢的方式处理C++11。)微软对API锁定非常满意。没有理由不使用标题,但这也是为什么这么多人甚至不知道它的存在的原因。@DevSolar:我相信Visual Studio的最新版本确实附带了stdint.h(在中提到了cstdin和stdint.h)-尽管他们已经放弃了C,当月亮是对我自己的时候,微软仍然试图保持与C++的一致性:我很清楚为什么没有人使用<代码> <代码>,但是我不能再对微软和他们的编译器维护的想法进行抨击,因为…算了吧,反正我都怪他们你能解释一下为什么你“非常清楚为什么没有人使用stdint.h”吗。它有缺点吗?@HappyMoyear:。直接引用MS支持:“C99合规性不是我们的优先事项”。那是2008年左右的。(目前他们正在以同样傲慢的方式处理C++11。)微软对API锁定非常满意。没有理由不使用这个标题,但是为什么有那么多人甚至不知道它的存在。@ DeViSudi:我相信Visual Studio的最新版本实际上是用Stdit.h(CSTDIN和STDITE.H在上面提到的)进行传输的。当他们放弃C时,微软仍然试图在月亮正确的时候跟上C++。