There are multiple related questions here:
-
Why is
#pragma oncenot automatically enforced?
Because there are situations in which you want to include files more than once. -
Why would you want to include a file multiple times?
Several reasons have been given in other answers (Boost.Preprocessor, X-Macros, including data files). I would like to add a particular example of “avoid code duplication”: OpenFOAM encourages a style where#includeing bits and pieces within functions is a common concept. See for example this discussion. -
Ok, but why is it not the default with an opt-out?
Because it is not actually specified by the standard.#pragmas are by definition implementation-specific extensions. -
Why has
#pragma oncenot become a standardized feature yet (as it is widely supported)?
Because pinning down what is “the same file” in a platform-agnostic way is actually surprisingly hard. See this answer for more information.