* Add versioned inline namespace Add a versioned inline namespace to prevent ABI issues when linking code using multiple library versions. * Add namespace macros * Encode ABI information in inline namespace Add _diag suffix to inline namespace if JSON_DIAGNOSTICS is enabled, and _ldvcmp suffix if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON is enabled. * Move ABI-affecting macros into abi_macros.hpp * Move std_fs namespace definition into std_fs.hpp * Remove std_fs namespace from unit test * Format more files in tests directory * Add unit tests * Update documentation * Fix GDB pretty printer * fixup! Add namespace macros * Derive ABI prefix from NLOHMANN_JSON_VERSION_*
2.2 KiB
JSON_DIAGNOSTICS
#define JSON_DIAGNOSTICS /* value */
This macro enables extended diagnostics for exception messages.
Possible values are 1 to enable or 0 to disable (default).
When enabled, exception messages contain a JSON Pointer to the JSON value that triggered the exception. Note that enabling this macro increases the size of every JSON value by one pointer and adds some runtime overhead.
The diagnostics messages can also be controlled with the CMake option JSON_Diagnostics (OFF by default) which sets
JSON_DIAGNOSTICS accordingly.
Default definition
The default value is 0 (extended diagnostics are switched off).
#define JSON_DIAGNOSTICS 0
When the macro is not defined, the library will define it to its default value.
Notes
!!! note "ABI compatibility"
As of version 3.11.0, this macro is no longer required to be defined consistently throughout a codebase to avoid
One Definition Rule (ODR) violations, as the value of this macro is encoded in the namespace, resulting in distinct
symbol names.
This allows different parts of a codebase to use different versions or configurations of this library without
causing improper behavior.
Where possible, it is still recommended that all code define this the same way for maximum interoperability.
Examples
??? example "Example 1: default behavior"
```cpp
--8<-- "examples/diagnostics_standard.cpp"
```
Output:
```
--8<-- "examples/diagnostics_standard.output"
```
This exception can be hard to debug if storing the value `#!c "12"` and accessing it is further apart.
??? example "Example 2: extended diagnostic messages"
```cpp
--8<-- "examples/diagnostics_extended.cpp"
```
Output:
```
--8<-- "examples/diagnostics_extended.output"
```
Now the exception message contains a JSON Pointer `/address/housenumber` that indicates which value has the wrong type.
Version history
- Added in version 3.10.0.
- As of version 3.11.0 the definition is allowed to vary between translation units.