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/