2016-11-23 6 views
0

私は、GCCコンパイラと組み合わせてfseeko関数を使用して、Cで4GiBより大きいファイルを処理しようとしています。今ではすべてが機能し、ファイルを扱うことができます4GiB以上であるが、GCCは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; 
} 

:これは、このメッセージを生成したソースコードの最小限の実施例です。あなたはこれらの要求は、POSIXインターフェイスは、デフォルトで公開されていない、完全に準拠した標準C環境(さらす、-std=c99または-std=c11よう-stdのいずれかのオプションを使用している場合

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

:GCCが与える正確な警告がこれですアプリケーションのために予約されている名前空間に入っているため、不適合となります)。それらを得るために適切な値に_POSIX_C_SOURCEまたは_XOPEN_SOURCEを定義する必要があります。任意のヘッダを含む前に、コマンドラインから-D_POSIX_C_SOURCE=200808L、またはソース・ファイル内

#define _POSIX_C_SOURCE 200808L 

は、これを行うための方法だろう。

また、これはすぐ問題ではありませんが、__USE_LARGEFILE64,_LARGEFILE_SOURCE、および_LARGEFILE64_SOURCEはすべて間違っています。あなたが64ビットのoff_tを得るために必要な唯一のことは、コマンドラインで-D_FILE_OFFSET_BITS=64、またはヘッダを含める前にソースファイルの#define _FILE_OFFSET_BITS 64です。

関連する問題