gpt4 book ai didi

c - 在哪里可以找到 off_t 类型的完整定义?

转载 作者:太空狗 更新时间:2023-10-29 16:16:59 28 4
gpt4 key购买 nike

我正在使用 TCP 从客户端向服务器发送文件。为了标记文件的结尾,我喜欢在实际数据之前发送文件大小。所以我使用 stat查找文件大小的系统调用。这是类型 off_t .我想知道它占用了多少字节,以便我可以在服务器端正确读取它。它在 <sys/types.h> 中定义.但是我不明白这个定义。它只是定义了 __off_t or _off64_t成为off_t .在哪里寻找 __off_t__也是约定俗成的吗?是头文件中大部分内容的前缀,当我阅读头文件以更好地理解时,这让我感到害怕。如何更好地读取头文件?

#ifndef __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define __off_t_defined
#endif

最佳答案

由于这个答案仍然被投票,我想指出你几乎不需要查看头文件。如果您想编写可靠的代码,那么查看标准会更好。因此,“我在哪里可以找到 off_t 的完整定义”的答案是“在标准中,而不是在头文件中”。遵循标准意味着您的代码今天和明天都可以在任何机器上运行。

在这种情况下,off_t 不是由 C 标准定义的。它是 POSIX 标准的一部分,you can browse here .

不幸的是,off_t 的定义不是很严格。我能找到的所有定义都在 sys/types.h 上的页面上:

blkcnt_t and off_t shall be signed integer types.

这意味着你不能确定它有多大。如果您使用的是 GNU C,则可以使用 the answer below 中的说明以确保它是 64 位的。或者更好的是,您可以在将其放在电线上之前转换为标准定义的尺寸。这就是像 Google 的 Protocol Buffers 这样的项目。工作(尽管这是一个 C++ 项目)。


为了完整起见,这里是“哪个头文件定义了 off_t?”的答案:

在我的机器上(以及大多数使用 glibc 的机器),你会在 bits/types.h 中找到定义(正如顶部的评论所说,永远不要直接包含这个文件),但它是在一堆宏中有点模糊。尝试解开它们的另一种方法是查看预处理器输出:

#include <stdio.h>
#include <sys/types.h>

int main(void) {
off_t blah;

return 0;
}

然后:

$ gcc -E sizes.c  | grep __off_t
typedef long int __off_t;
....

但是,如果您想知道某物的大小,您始终可以使用 sizeof() 运算符。

编辑:刚刚看到您的问题中关于__ 的部分。 This answer has a good discussion .关键点是以 __ 开头的名称保留用于实现(因此您不应该以 __ 开头您自己的定义)。

关于c - 在哪里可以找到 off_t 类型的完整定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9073667/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com