Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数fseeko的隐式声明_C_Large Files_Fseek - Fatal编程技术网

C 函数fseeko的隐式声明

C 函数fseeko的隐式声明,c,large-files,fseek,C,Large Files,Fseek,我试图将fseeko函数与GCC编译器结合使用,以便处理C中大于4GiB的文件。现在,一切都正常,我可以处理超过4GiB的文件,但GCC一直抱怨fseeko函数是隐式声明的。这是生成此消息的源代码的一个最小工作示例: #define __USE_LARGEFILE64 #define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #include "MemoryAllocator.h" #include <stdio.h> #incl

我试图将
fseeko
函数与GCC编译器结合使用,以便处理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;
}

如果您正在使用
-std
选项之一,如
-std=c99
-std=c11
,则这些选项要求一个完全一致的标准C环境,其中POSIX接口默认不公开(公开它们将是不一致的,因为它们位于为应用程序保留的命名空间中)。您需要将
\u POSIX\u C\u SOURCE
\u XOPEN\u SOURCE
定义为适当的值才能获得它们<命令行上的code>-D_POSIX_C_SOURCE=200808L,或

#define _POSIX_C_SOURCE 200808L
在您的源文件中包含任何头文件之前,可以这样做


此外,虽然这不是您当前的问题,但请注意,
\u使用大文件64
\u大文件\u源代码
\u大文件64\u源代码
都是不正确的。在包含任何头文件之前,您只需在命令行上或在源文件中定义64位
-D\u-OFFSET\u-BITS=64
,或在源文件中定义64位
-D\u-OFFSET\u-BITS 64

fseeko
在Posix中,而不是将MemoryAllocator.h定义为OC(x)的标准CAssuming,然后这个程序在POSIX平台上编译得很好。但是,如果您试图在Windows上构建,它将不起作用。您使用的编译器命令行是什么?在包含任何标题之前,您是否已将
\u XOPEN\u SOURCE
\u POSIX\u C\u SOURCE
设置为适当的值?
\u使用大文件64
\u大文件\u SOURCE
\u大文件64\u SOURCE
都不正确。阅读文档,而不是随意阅读
-D_FILE_OFFSET_BITS=64
是您要查找的,但它与
fseeko
不可见的原因无关。
#define _POSIX_C_SOURCE 200808L