For whence
parameter of fseek
(or lseek
in POSIX), some languages that calls C lib assume SEEK_SET, SEEK_CUR SEEK_END is 0,1,2, respectively, such as gfortran, Nim [^py].
[^py]: while Python’s seek specializes concentrate values of SEEK_*
, CPython does map 0,1,2 to C lib’s values innerly.
I’ve looked up C and POSIX specialization, neither specializes concentrate values of SEEK_*
.
In code, I wonder in which OS and C compiler, the following code’s output isn’t 012
:
#include <stdio.h>
int main(){
printf("%d%d%dn", SEEK_SET, SEEK_CUR, SEEK_END);
}
I’ve tested on some OSes and C compilers, where the output is just 012
:
- Windows: gcc(mingw)
- Debian: clang, gcc
- FreeBSD: clang
- Solaris(SunOS5): Oracle Solaris Studio C Compiler
And if there’re none, then it’s less meaningful to add fix for the existing implementations using fixed values.
7
Will SEEK_SET SEEK_CUR SEEK_END aren’t 0,1,2 on any C lib?
Maybe. Yet if not today, maybe tomorrow.
If you must use 0, 1, 2 in calling fseek()
, use the number as an array index.
I doubt there is a real case where one must do so.
#include <stdio.h>
const int whence [] = { SEEK_SET, SEEK_CUR, SEEK_END };
int result = fseek(stream, 0, whence[2]); // Go to the end