函数 fseeko 的隐式声明
Implicit declaration of function fseeko
我正在尝试将 fseeko
函数与 GCC-compiler 结合使用,以便在 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] = '[=10=]';
return buffer;
}
我无法在任何地方找到 header 我必须包含的内容才能修复此警告。 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);
如果您正在使用 -std
选项之一,例如 -std=c99
或 -std=c11
,这些选项需要一个完全符合标准的 C 环境,其中 POSIX 接口不公开默认情况下(公开它们将是 non-conforming 因为它们在为应用程序保留的名称空间中)。您需要将 _POSIX_C_SOURCE
或 _XOPEN_SOURCE
定义为适当的值才能获取它们。 -D_POSIX_C_SOURCE=200808L
在命令行上,或
#define _POSIX_C_SOURCE 200808L
在您的源文件中包含任何 headers 之前,将是执行此操作的方法。
此外,虽然这不是您的直接问题,但请注意 __USE_LARGEFILE64
、_LARGEFILE_SOURCE
和 _LARGEFILE64_SOURCE
都是不正确的。要获得 64 位 off_t
,您唯一需要做的就是在命令行上 -D_FILE_OFFSET_BITS=64
或在包含任何 headers.[=23= 之前在源文件中 #define _FILE_OFFSET_BITS 64
]
我正在尝试将 fseeko
函数与 GCC-compiler 结合使用,以便在 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] = '[=10=]';
return buffer;
}
我无法在任何地方找到 header 我必须包含的内容才能修复此警告。 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);
如果您正在使用 -std
选项之一,例如 -std=c99
或 -std=c11
,这些选项需要一个完全符合标准的 C 环境,其中 POSIX 接口不公开默认情况下(公开它们将是 non-conforming 因为它们在为应用程序保留的名称空间中)。您需要将 _POSIX_C_SOURCE
或 _XOPEN_SOURCE
定义为适当的值才能获取它们。 -D_POSIX_C_SOURCE=200808L
在命令行上,或
#define _POSIX_C_SOURCE 200808L
在您的源文件中包含任何 headers 之前,将是执行此操作的方法。
此外,虽然这不是您的直接问题,但请注意 __USE_LARGEFILE64
、_LARGEFILE_SOURCE
和 _LARGEFILE64_SOURCE
都是不正确的。要获得 64 位 off_t
,您唯一需要做的就是在命令行上 -D_FILE_OFFSET_BITS=64
或在包含任何 headers.[=23= 之前在源文件中 #define _FILE_OFFSET_BITS 64
]