2016-11-23 2 views
0

Я пытаюсь использовать функцию fseeko в сочетании с компилятором GCC для работы с файлами размером более 4GiB в C. Теперь все работает, и я могу работать с файлами более 4GiB, но GCC продолжает жаловаться, что функция fseeko неявно объявлена. Это минимальный рабочий пример исходного кода, который генерирует это сообщение:Неявное объявление функции 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; 
} 

Я не могу найти где-нибудь, что заголовок я должен включить, чтобы исправить это предупреждение. Точное предупреждение, что дает GCC это:

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' находится в Posix, а не стандартно. C – deamentiaemundi

+1

Предполагая, что' MemoryAllocator.h' определяет mem_alloc (x) как malloc (x) и FSEEK как fseeko, тогда эта программа отлично компилируется на платформе POSIX. Однако, если вы пытаетесь построить на Windows, это не сработает. – NickStoughton

+1

Что именно используется в командной строке компилятора? Установили ли вы '_XOPEN_SOURCE' или' _POSIX_C_SOURCE' соответствующее значение, прежде чем включать какие-либо заголовки? –

ответ

1

Если вы используете один из вариантов, как -std-std=c99 или -std=c11, это запросить полностью конформную среду стандарта C, где POSIX интерфейсы не подвергается по умолчанию (подвергая их будут несоответствия, поскольку они находятся в пространстве имен, зарезервированных для приложения). Вы должны определить _POSIX_C_SOURCE или _XOPEN_SOURCE для получения соответствующего значения. -D_POSIX_C_SOURCE=200808L в командной строке, или

#define _POSIX_C_SOURCE 200808L 

в исходном файле, прежде чем включать все заголовки, был бы способ сделать это.

Кроме того, если это не ваша непосредственная проблема, обратите внимание, что, _LARGEFILE_SOURCE и _LARGEFILE64_SOURCE все неверны. Единственное, что вам нужно сделать, чтобы получить 64-битный off_t, - -D_FILE_OFFSET_BITS=64 в командной строке или #define _FILE_OFFSET_BITS 64 в исходном файле, прежде чем включать любые заголовки.

Смежные вопросы