Большинство платформ на основе POSIX поддерживают символ препроцессора " _FILE_OFFSET_BITS ". Установка этого значения на 64 приведет к тому, что тип off_t будет 64 бит вместо 32, а функции манипулирования файлами, такие как lseek () будут автоматически поддерживать смещение 64 бит через некоторую магию препроцессора. С точки зрения времени компиляции добавление поддержки смещения 64-битного файла таким способом довольно прозрачно, если вы правильно используете соответствующие typedefs. Естественно, ваш ABI изменится, если вы выставите интерфейсы, которые используют тип off_t . В идеале вы должны определить это в командной строке, например ::
cxx -D_FILE_OFFSET_BITS=64
, чтобы убедиться, что он применяется ко всем заголовкам ОС, включенным в ваш код.
К сожалению, Windows не поддерживает этот символ препроцессора, поэтому вам придется либо обрабатывать его самостоятельно, либо полагаться на библиотеку, которая обеспечивает межплатформенную поддержку больших файлов. ACE - одна из таких библиотек (как на платформе POSIX, так и на платформах Windows - просто определите _FILE_OFFSET_BITS = 64 в обоих случаях). Я знаю, что Boost.filesystem также поддерживает большие файлы на платформах на основе POSIX, но я не уверен насчет Windows. Другие кроссплатформенные библиотеки, вероятно, предоставляют аналогичную поддержку.