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

时间:2014-08-29 08:43:54

标签: c typedef function-calls

我目前正在Linux中进行一些网络编程,为此我自己做了一些便携性的典型代码

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)

3 个答案:

答案 0 :(得分:6)

C pet peveve ... <stdint.h>和它提供的标准 typedef有什么问题?每个人似乎都使用自己发明的typedef,但实际上似乎没有人使用标准包含(包含适当的宏printf()scanf()处理等)。


如果API调用需要int,则应传递 int,而不要假设所述int的原生宽度(因为假设)在最不幸的时刻倾向于打破。)

如果确切的宽度很重要,则使用定义宽度的typedef 。 (例如,结构布局,硬件驱动程序的跨平台二进制兼容性......)

答案 1 :(得分:2)

你应该使用你自己的typedef,因为标准<stdint.h>标题提供了更好的选择 - 因为它是标准的。

你应该将你自己的类型传递给标准函数的包装器,因为这会因为可移植性而无法使用你自己的类型。例如文件描述符是int,你不应该认为它是一个int32。

答案 2 :(得分:2)

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

另外我建议你看一下已经包含所有这些定义的stdint.h文件。

希望这有帮助。

卡尔斯。

相关问题