首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#define __REDIRECT_NTH在unistd.h中做什么?

#define __REDIRECT_NTH在unistd.h中做什么?
EN

Stack Overflow用户
提问于 2010-12-19 10:21:24
回答 3查看 1.1K关注 0票数 5

GNU unistd.h有这样一点魔力:

代码语言:javascript
复制
/* 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是什么意思?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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“指的是”无抛出“,这是宏所生成的函数声明的一个属性。

票数 7
EN

Stack Overflow用户

发布于 2010-12-19 10:25:27

它是为实现保留的命名空间中的宏。它只出现在您的平台上;它在您的平台上执行任何适当的操作,因为实现确定它是正确的。

如果你不能轻易地找到答案,你可能不应该直接使用它。即使你能找到答案,也很有可能你不应该直接使用它。

也就是说,它似乎安排了将对lseek()的调用转换为lseek64(),大概是为了在32位计算机上(或在64位计算机上的32位系统GiB下)提供对大文件(大于2个API )的支持。

票数 2
EN

Stack Overflow用户

发布于 2010-12-19 22:31:20

永远不要自己去碰大文件黑客。始终在您的CFLAGS中包含-D_FILE_OFFSET_BITS=64,这样您就永远不会出错。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4481293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档