2016-11-23 8 views
0

Ich versuche, die fseeko Funktion in Kombination mit dem GCC-Compiler zu verwenden, um mit Dateien zu arbeiten, die größer als 4GiB in C sind. Jetzt funktioniert alles und ich kann mit Dateien arbeiten von über 4GiB, aber GCC beschwert sich, dass die fseeko Funktion implizit deklariert wird. Dies ist ein minimal Arbeitsbeispiel der der Quellcode, der diese Nachricht erzeugt:Implizite Erklärung der Funktion fseeko

#define __USE_LARGEFILE64 
#define _LARGEFILE_SOURCE 
#define _LARGEFILE64_SOURCE 

#include "MemoryAllocator.h" 

#include <stdio.h> 
#include <stdbool.h> 
#include <stdlib.h> 
#include <sys/stat.h> 

typedef struct BlockReader { 
    char* fileName; 
    // Total filesize of the file with name fileName in bytes. 
    unsigned long long fileSize; 
    // Size of one block in bytes. 
    unsigned int blockSize; 
    // Defines which block was last read. 
    unsigned int block; 
    // Defines the total amount of blocks 
    unsigned int blocks; 
} BlockReader; 

unsigned char* blockreader_read_raw_block(BlockReader* reader, long startPos, unsigned int length, size_t* readLength) { 
    FILE* file = fopen(reader->fileName, "rb"); 

    unsigned char* buffer = (unsigned char*) mem_alloc(sizeof(unsigned char) * (length + 1)); 

    FSEEK(file, startPos, 0); 
    fclose(file); 

    // Terminate buffer 
    buffer[length] = '\0'; 
    return buffer; 
} 

ich nirgendwo finden können, was Header muss ich schließen diese Warnung zu beheben. Die genaue Warnung, dass GCC gibt, ist dies:

src/BlockReader.c: In function ‘blockreader_read_block’: 
src/BlockReader.c:80:2: warning: implicit declaration of function ‘fseeko’ [-Wimplicit-function-declaration] 
    FSEEK(file, reader->blockSize * reader->block, 0); 
+1

'fseeko' ist in Posix, nicht Standard C – deamentiaemundi

+1

Angenommen,' MemoryAllocator.h' definiert mem_alloc (x) als malloc (x) und FSEEK als fseeko, dann kompiliert dieses Programm auf einer POSIX-Plattform. Wenn Sie jedoch versuchen, auf Windows aufzubauen, wird es nicht funktionieren. – NickStoughton

+1

Was genau ist die Compiler-Befehlszeile, die Sie verwenden? Haben Sie '_XOPEN_SOURCE' oder' _POSIX_C_SOURCE' auf einen geeigneten Wert gesetzt, bevor Sie Header einfügen? –

Antwort

1

Wenn Sie eine der -std Optionen wie -std=c99 oder -std=c11 verwenden, diese eine vollständig konforme Standard-C-Umgebung verlangen, wo POSIX-Schnittstellen sind standardmäßig nicht ausgesetzt (aussetzt sie wäre nicht konform, da sie sich im für die Anwendung reservierten Namensraum befinden). Sie müssen _POSIX_C_SOURCE oder _XOPEN_SOURCE zu einem geeigneten Wert definieren, um sie zu erhalten. -D_POSIX_C_SOURCE=200808L auf der Kommandozeile oder

#define _POSIX_C_SOURCE 200808L 

in der Quelldatei, bevor Sie Header einschließlich, wäre der Weg, dies zu tun.

Auch wenn dies nicht Ihr unmittelbares Problem ist, beachten Sie, dass __USE_LARGEFILE64, _LARGEFILE_SOURCE und _LARGEFILE64_SOURCE alle falsch sind. Das einzige, was Sie tun müssen, um 64-Bit off_t zu erhalten, ist -D_FILE_OFFSET_BITS=64 in der Befehlszeile oder #define _FILE_OFFSET_BITS 64 in Ihrer Quelldatei vor dem Einschließen von Kopfzeilen.

Verwandte Themen