La mayoría de las plataformas POSIX admiten el símbolo del preprocesador "_FILE_OFFSET_BITS". Establecerlo en hará que el tipo off_t sea de 64 bits en lugar de 32 y las funciones de manipulación de archivos como lseek() admitirán automáticamente el desplazamiento de 64 bits mediante alguna magia de preprocesador. Desde el punto de vista del tiempo de compilación, agregar soporte de compensación de archivos de 64 bits de esta manera es bastante transparente, suponiendo que está utilizando correctamente los tipos de archivos correspondientes. Naturalmente, su ABI cambiará si expone las interfaces que utilizan el tipo off_t. Lo ideal es que definirlo en la línea de comandos, por ejemplo .:
cxx -D_FILE_OFFSET_BITS=64
para asegurarse de que se aplica a todas las cabeceras del sistema operativo incluidos por su código.
Desafortunadamente, Windows no es compatible con este símbolo del preprocesador, por lo que tendrá que manejarlo usted mismo o confiar en una biblioteca que ofrezca compatibilidad con archivos grandes multiplataforma. ACE es una de esas bibliotecas (ambas basadas en POSIX y plataformas de Windows - simplemente defina _FILE_OFFSET_BITS = 64 en ambos casos). Sé que Boost.filesystem también admite archivos de gran tamaño en plataformas basadas en POSIX, pero no estoy seguro acerca de Windows. Es probable que otras bibliotecas multiplataforma proporcionen soporte similar.
También los tipos son diferentes. Windows usa '__int64' y gcc usa' size-t'. ¿Cuál sería la mejor manera de 'printf' estos? '"% llu ", (unsigned long long) offset'? – hippietrail
@hippietrail: IMO está off_t/off64_t en gcc – rsjethani