__USAGE_FICHIER_OFFSET64 vs _FILE_OFFSET_BITS=64
Je suis en train d'essayer de maintenir un code qui compile sur des lots de différents systèmes. J'ai vu une douzaine de façons différentes de poser pour lseek
qui prend 64-bits. Certains systèmes utilisent lseek64
, certains utilisent lseeko
, certains exigent que vous définissez _FILE_OFFSET_BITS=64
, et maintenant, je viens de trouver un nouveau qui exige que vous définissez __USE_FILE_OFFSET64
.
Est-il un standard pour tout cela?
Vous devez vous connecter pour publier un commentaire.
Il y a getconf valeurs de la norme IEEE Std 1003.1-2004 (et une nouvelle situé dans IEEE Std 1003.1-2008; voir aussi les EXEMPLES de la section, dans ces documents). Réelle des options du compilateur (qui pourrait même ne pas être définit) ne sont pas spécifiés.
Cependant, la
AC_SYS_LARGEFILE
macro dans autoconf n'essayez pas d'utiliser cette — il essaie juste-n32
pour IRIX,-D_FILE_OFFSET_BITS=64
(qui devrait fonctionner pour la plupart des systèmes) et-D_LARGE_FILES=1
(apparemment pour AIX). Il y a aussi une référence à la Ajout de Support pour les Fichiers Arbitraires Tailles pour la Single UNIX Specification (un vieux spec projet qui a ensuite été partiellement inclus dans la norme POSIX.1 spec) dans autoconf sources.Que pour définir
__USE_FILE_OFFSET64
manuellement, vous ne savez pas si c'est vraiment une bonne solution — double-trait de soulignement macros sont réservés pour le système d'en-têtes, et il est probablement conditionnelle définition, qui dépend d'autres définit.Dans
features.h
, vous voyez la relation entre_FILE_OFFSET_BITS
et__USE_FILE_OFFSET64
.De la sorte, seuls
_FILE_OFFSET_BITS
est conçu pour les utilisateurs.defined
test est inutile au-dessus de la libc code. Si_FILE_OFFSET_BITS == 64
réussit, alors la macro doit être défini; sinon, comment fait-il l'étendre à 64 ans? Si la macro n'est pas défini, alors_FILE_OFFSET_BITS
étendra à0
, et le test échouera.defined
test est d'éviter les mises en garde de gcc est-Wundef
mode, qui est utilisé lors de la construction de la libc lui-même, parce que la glibc a un beaucoup de la configuration interne des macros et qu'ils veulent éviter les fautes de frappe. Parce que c'est la version de la libc lui-même, les en-têtes de ne pas avoir l'habitude d'exemption de l'avertissement que gcc s'applique à "système de têtes".