1. ホーム
  2. c

[解決済み] off_t型の完全な定義はどこにあるのですか?

2022-02-03 15:44:42

質問

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標準の一部であり、POSIX標準は こちらからご覧いただけます。 .

残念ながら off_t はあまり厳密には定義されていません。私が見つけた定義は、以下のページだけです。 sys/types.h :

blkcnt_toff_t は符号付き整数型でなければならない。

つまり、大きさを確かめることができないのです。GNU Cを使用している場合は、以下の命令を使用することができます。 以下の回答 で、64ビットであることを確認します。もっといいのは、配線する前に標準的なサイズに変換しておくことです。このようにして、Googleのようなプロジェクトは プロトコルバッファ が動作します(ただし、これはC++のプロジェクトです)。


どのヘッダーファイルで定義されているか? off_t ?quot;。

私のマシンでは (そして 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() 演算子を使用します。

編集:ご質問の中の __ . この回答には、良い議論があります。 . で始まる名前が重要なポイントになります。 __ は実装のために予約されています (ですから、独自の定義の先頭に __ ).