why include cpython/*.h, Need this macro ? # error "this header file must not be included directly"
#ifndef Py_LIMITED_API # define Py_CPYTHON_FILEOBJECT_H # include "cpython/fileobject.h" # undef Py_CPYTHON_FILEOBJECT_H #endif cpython/fileobject.h ``` #ifndef Py_CPYTHON_FILEOBJECT_H # error "this header file must not be included directly" #endif ``` why not use #ifndef #define cpython/fileobject.h #ifndef Py_CPYTHON_FILEOBJECT_H #define Py_CPYTHON_FILEOBJECT_H .... #endif /* Py_CPYTHON_FILEOBJECT_H */
10.01.21 09:53, junyixie пише:
#ifndef Py_LIMITED_API # define Py_CPYTHON_FILEOBJECT_H # include "cpython/fileobject.h" # undef Py_CPYTHON_FILEOBJECT_H #endif
cpython/fileobject.h ``` #ifndef Py_CPYTHON_FILEOBJECT_H # error "this header file must not be included directly" #endif ```
why not use #ifndef #define cpython/fileobject.h #ifndef Py_CPYTHON_FILEOBJECT_H #define Py_CPYTHON_FILEOBJECT_H .... #endif /* Py_CPYTHON_FILEOBJECT_H */
Because it will not produce compile-time error when you include that header files directly. The division of these declarations on few files is a deep implementation detail. Header file "cpython/fileobject.h" is not a part of API and we do not want users to use them directly and then fail because in next feature (or even bugfix) release some declarations have been moved to other files.
On Sun, Jan 10, 2021 at 9:27 PM Serhiy Storchaka <storchaka@gmail.com> wrote:
Because it will not produce compile-time error when you include that header files directly.
The division of these declarations on few files is a deep implementation detail. Header file "cpython/fileobject.h" is not a part of API and we do not want users to use them directly and then fail because in next feature (or even bugfix) release some declarations have been moved to other files.
Yeah, the cpython/ subdirectory is the API which is excluded from the limited C API (Py_LIMITED_API macro). But for end users, #include "Python.h" should be enough. #ifndef Py_CPYTHON_FILEOBJECT_H # error "this header file must not be included directly" #endif This is to prevent users to include the API by mistake. Only the parent header file must be used, like #include "fileobject.h". Victor -- Night gathers, and now my watch begins. It shall not end until my death.
participants (3)
-
junyixie
-
Serhiy Storchaka
-
Victor Stinner