Où trouver la définition complète de off_t type?
Je suis l'envoi de fichier du client vers le serveur en utilisant le protocole TCP. Pour marquer la fin du fichier, je tiens à envoyer un fichier de taille avant de les données réelles. J'ai donc utiliser stat
appel système pour trouver la taille du fichier. C'est de type off_t
. Je voudrais savoir combien d'octets il occupe afin que je puisse le lire correctement sur le serveur. Il est défini dans la <sys/types.h>
. Mais je ne comprends pas la définition. Il ne définit __off_t or _off64_t
être off_t
. Où chercher __off_t
? Aussi est-il de la convention qui __
est le préfixe pour la plupart des choses dans les fichiers d'en-tête et me fait peur quand je lis des fichiers d'en-tête pour mieux comprendre. Comment lire un fichier d'en-tête mieux?
#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
- Tout ce qui commence par
__
est réservé pour une utilisation par la mise en œuvre (à moins que la norme définit un sens pour elle, comme dans__func__
ou__FILE__
). Le niveau d'indirection permet la mise en œuvre de définir son propre type__off_t
sans interférer avec tout ce que vous pouvez légitimement. La plate-forme de bits de l'en-tête peut alors être mieux caché (donc une seule copie du code source peut gérer 32 bits et 64 bits des compilations sur une seule machine, par exemple). La lecture des en-têtes standard est l'un des principaux corvée, car il ya tellement interdépendants, les définitions.
Vous devez vous connecter pour publier un commentaire.
Depuis cette réponse obtient toujours voté, je tiens à souligner que vous devriez presque jamais besoin de regarder dans les fichiers d'en-tête. Si vous voulez écrire du code fiable, vous êtes beaucoup mieux servi par la recherche dans la norme. Une meilleure question de "comment est
off_t
définie sur ma machine" est "comment estoff_t
définies par la norme?". À la suite de la norme signifie que votre code fonctionne aujourd'hui et de demain, sur n'importe quelle machine.Dans ce cas,
off_t
n'est pas défini par la norme. Il fait partie de la norme POSIX, qui vous pouvez parcourir ici.Malheureusement,
off_t
n'est pas très rigoureusement définis. Tout ce que je pouvais trouver à définir c'est sur la page dusys/types.h
:Cela signifie que vous ne pouvez pas être sûr de savoir comment il est grand. Si vous utilisez GNU C, vous pouvez utiliser les instructions de la réponse ci-dessous pour s'assurer qu'il est en 64 bits. Ou mieux, vous pouvez convertir des normes de taille définie avant de le mettre sur le fil. C'est la manière dont les projets comme Google Protocol Buffers de travail (bien que ce soit un projet C++).
Donc, je pense que "où puis-je trouver la définition dans mes fichiers d'en-tête n'est pas la meilleure question.
Mais, pour être complet, voici la réponse:
Vous trouverez la définition de
bits/types.h
(comme un commentaire dit en haut, jamais directement inclure ce fichier), mais c'est obscurci un peu dans un groupe de macros. Une alternative à essayer de démêler est de regarder le préprocesseur de sortie:Et puis:
Toutefois, si vous voulez savoir la taille de quelque chose, vous pouvez toujours utiliser le
sizeof()
opérateur.Edit: Viens de voir la partie de votre question sur la
__
. Cette réponse a une bonne discussion. Le point clé est que les noms commençant par__
sont réservés pour la mise en œuvre (de sorte que vous ne devriez pas commencer votre propre définition avec__
).off_t
peuvent être de tailles différentes sur différentes machines (ou des compilateurs). Notez que dans GCC, vous pouvez utiliser-D_FILE_OFFSET_BITS=64
pour obtenir 8 octetsoff_t
etsize_t
définitions.-D_FILE_OFFSET_BITS=64
lors de la compilation à la fois de serveur et de client, alors vous savez queoff_t
est de 8 octets sur le client et le serveur.Comme la "Bibliothèque C de GNU Manuel de Référence", dit
et
Donc si vous voulez des fiable façon de représenter la taille de fichier entre le client et le serveur, vous pouvez:
off64_t
type etstat64()
fonction en conséquence (comme il le comble de la structurestat64
, qui contientoff64_t
type lui-même). Typeoff64_t
garanties de la même taille sur 32 bits et 64 bits des machines.-D_FILE_OFFSET_BITS == 64
et l'utilisation d'habitudeoff_t
etstat()
.Convertir
off_t
de typeint64_t
avec taille fixe (standard C99).Remarque: (mon livre 'C en un Mot' dit que c'est standard C99, mais en option dans la mise en œuvre). La nouvelle norme C11 dit:
Et sur la mise en œuvre:
Donc, en général, C standard ne peut pas garantir avec des types de taille fixe. Mais la plupart des compilateurs (y compris gcc) en charge cette fonctionnalité.
Si vous rencontrez des problèmes de traçage les définitions, vous pouvez utiliser la séquence de sortie du compilateur qui vous dira tout ce que vous devez savoir. E. g.
Si vous regardez à la production complète, vous pouvez même voir l'en-tête exact emplacement du fichier et le numéro de ligne où il a été défini:
...
Si vous écrivez du code portable, la réponse est "vous ne pouvez pas dire", la bonne nouvelle est que vous n'avez pas besoin d'. Le protocole devrait impliquer l'écriture de la taille (par exemple) "8 octets, format big-endian" (Idéalement avec un chèque que le réel correspond à la taille de 8 octets.)