La maggior parte delle piattaforme basate su POSIX supportano il simbolo del preprocessore "_FILE_OFFSET_BITS". Impostandolo su , il tipo off_t sarà 64 bit anziché 32 e le funzioni di manipolazione del file come lseek() supporteranno automaticamente l'offset a 64 bit tramite alcune magie del preprocessore. Dal punto di vista della compilazione, l'aggiunta del supporto di offset dei file a 64 bit in questo modo è abbastanza trasparente, assumendo che si stiano utilizzando correttamente i typedef pertinenti. Ovviamente, l'ABI cambierà se stai esponendo le interfacce che utilizzano il tipo off_t. Idealmente si dovrebbe definire sulla riga di comando, ad es .:
cxx -D_FILE_OFFSET_BITS=64
per assicurarsi che si applica a tutte le intestazioni OS inclusi dal codice.
Sfortunatamente, Windows non supporta questo simbolo del preprocessore, quindi è necessario gestirlo autonomamente o fare affidamento su una libreria che fornisce il supporto per file di grandi dimensioni multipiattaforma. ACE è una di queste librerie (entrambe basate su POSIX e piattaforme Windows - basta definire _FILE_OFFSET_BITS = 64 in entrambi i casi). So che Boost.filesystem supporta anche file di grandi dimensioni su piattaforme basate su POSIX, ma non sono sicuro di Windows. Altre librerie multipiattaforma forniscono probabilmente un supporto simile.
Anche i tipi sono diversi. Windows usa '__int64' e gcc usa' size-t'. Quale sarebbe il modo migliore per 'printf' questi? '"% llu ", (unsigned long long) offset'? – hippietrail
@hippietrail: IMO è off_t/off64_t su gcc – rsjethani