For whence
parameter of fseek
(or lseek
in POSIX), some languages that calls C lib assume SEEK_SET
, SEEK_CUR
, SEEK_END
are 0,1,2, respectively, such as gfortran, Nim [^py].
SEEK_*
, CPython does map 0,1,2 to C lib’s values internally.
I’ve looked up C and POSIX specialization, neither specializes concrete 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), MSVC
- Debian: clang, gcc
- FreeBSD: clang
- Solaris(SunOS5): Oracle Solaris Studio C Compiler
- Android(Termux): clang
And if there’re none, then it’s less meaningful to add fix for the existing implementations using fixed values.
2
Answers
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.
In the ideal instance, you would want to write a C program to create an include file for the constants for the language that does not have those constants defined. e.g.
I have no idea what fortran include files look like, this would need to be fixed.
In this particular instance, SEEK_SET, SEEK_CUR and SEEK_END are well defined as 0, 1, and 2, and you aren’t going to have a problem with them.