GNU unistd.h有这样一点魔力:
/* Move FD's file position to OFFSET bytes from the
beginning of the file (if WHENCE is SEEK_SET),
the current position (if WHENCE is SEEK_CUR),
or the end of the file (if WHENCE is SEEK_END).
Return the new file position. */
#ifndef __USE_FILE_OFFSET64
extern __off_t lseek (int __fd, __off_t __offset, int __whence) __THROW;
#else
# ifdef __REDIRECT_NTH
extern __off64_t __REDIRECT_NTH (lseek,
(int __fd, __off64_t __offset, int __whence),
lseek64);
# else
# define lseek lseek64
# endif
#endif
#ifdef __USE_LARGEFILE64
extern __off64_t lseek64 (int __fd, __off64_t __offset, int __whence) __THROW;
#endif__REDIRECT_NTH是什么意思?
发布于 2013-11-29 04:45:26
关于REDIRECT_NTH含义的更多细节:宏将生成一个函数声明,该声明告诉编译器在编译器的ELF输出中使用函数的特定符号。默认情况下,编译器对名为"lseek“(或在某些系统上为"_lseek")的C函数使用ELF符号"lseek”。此宏扩展为告诉编译器改用符号"lseek64“的代码。因此,C代码有一个名为"lseek“的函数,但是当你查看目标代码(例如,使用程序'nm')时,你会看到"lseek64”。
这样做的目的是该函数实际上是二进制级别的lseek64 -它处理64位文件偏移量。但源代码已经声明,出于向后源代码兼容性的原因( _FILE_OFFSET_BITS=64是这么说的),它希望将其命名为lseek。
如果源程序希望使用该名称调用lseek64,并让lseek引用旧的32位版本,则必须定义_LARGEFILE64_SOURCE而不是_FILE_OFFSET_BITS=64。
顺便说一下,"REDIRECT_NTH“中的”n“指的是”无抛出“,这是宏所生成的函数声明的一个属性。
发布于 2010-12-19 10:25:27
它是为实现保留的命名空间中的宏。它只出现在您的平台上;它在您的平台上执行任何适当的操作,因为实现确定它是正确的。
如果你不能轻易地找到答案,你可能不应该直接使用它。即使你能找到答案,也很有可能你不应该直接使用它。
也就是说,它似乎安排了将对lseek()的调用转换为lseek64(),大概是为了在32位计算机上(或在64位计算机上的32位系统GiB下)提供对大文件(大于2个API )的支持。
发布于 2010-12-19 22:31:20
永远不要自己去碰大文件黑客。始终在您的CFLAGS中包含-D_FILE_OFFSET_BITS=64,这样您就永远不会出错。
https://stackoverflow.com/questions/4481293
复制相似问题