c - #define __REDIRECT_NTH 在 unistd.h 中做了什么?

标签 c unistd.h

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 是什么意思?

最佳答案

有关 REDIRECT_NTH 含义的更多详细信息:宏生成一个函数声明,告诉编译器在编译器的 ELF 输出中为该函数使用特定符号。默认情况下,编译器将 ELF 符号“lseek”用于名为“lseek”(或者,在某些系统上,“_lseek”的 C 函数”)。该宏扩展为告诉编译器改用符号“lseek64”的代码。所以 C 代码有一个名为“lseek”的函数,但是当您查看目标代码时(例如,使用程序“nm”),您会看到“lseek64”。

这样做的目的是该函数实际上是二进制级别的 lseek64 - 它处理 64 位文件偏移量。但是源代码已经声明它想要调用它 lseek,出于向后源兼容性的原因(这就是 _FILE_OFFSET_BITS=64 所说的)。

如果源程序想用那个名字调用lseek64,并且让lseek引用旧的32位版本,它必须定义_LARGEFILE64_SOURCE 而不是 _FILE_OFFSET_BITS=64

顺便说一句,“REDIRECT_NTH”中的“NTH”指的是“不抛出”,这是宏生成的函数声明的一个属性。

关于c - #define __REDIRECT_NTH 在 unistd.h 中做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4481293/

相关文章:

c - C 中的预期表达式错误

使用 getcwd 在 C 字符串中始终获取空值

c - 如何选择其中一个选项?

c - 使用 OpenGL 的 cometd Wild 2 形状数据的基本渲染

c - 如何简单地生成与所有base64编码兼容的随机base64字符串

c - 在 C 中为银行程序使用文本文件

C 为什么我的代码中创建的线程数不一致?

c - 如何暂停C程序?

c - 获取程序原来被调用的位置

c - 从c中的文件获取输入时出错