4. Configuration for the preprocessor
4.1. Preprocessing directives
Non-standard preprocessing directives can be controlled using the directives:
#pragma TenDRA directive ppdir allow #pragma TenDRA directive ppdir (ignore) allow
where ppdir can be assert
, file
, ident
, import
(C++ only), include_next
(C++ only), unassert
, warning
(C++ only) or weak
. The second form causes the directive to be processed but ignored (note that there is no (ignore) disallow
form). The treatment of other unknown preprocessing directives can be controlled using:
#pragma TenDRA unknown directive allow
Cases where the token following the #
in a preprocessing directive is not an identifier can be controlled using:
#pragma TenDRA no directive/nline after ident allow
When permitted, unknown preprocessing directives are ignored.
By default, unknown #pragma
directives are ignored without comment, however this behaviour can be modified using the directive:
#pragma TenDRA unknown pragma allow
Note that any unknown #pragma TenDRA
directives always give an error.
Older preprocessors allowed text after #else
and #endif
directives. The following directive can be used to enable such behaviour:
#pragma TenDRA text after directive allow
Such text after a directive is ignored.
Some older preprocessors have problems with white space in preprocessing directives - whether at the start of the line, before the initial #
, or between the #
and the directive identifier. Such white space can be detected using the directives:
#pragma TenDRA indented # directive allow #pragma TenDRA indented directive after # allow
respectively.
4.2. File inclusion directives
There is a maximum depth of nested #include
directives allowed by the C++ producer. This depth is given by the include_depth
implementation quantity mentioned above. Its value is fairly small in order to detect recursive inclusions. The maximum depth can be set using:
#pragma TenDRA includes depth integer-literal
A further check, for full pathnames in #include
directives (which may not be portable), can be enabled using the directive:
#pragma TenDRA++ complete file includes allow
4.3. Macro definitions
By default, multiple consistent definitions of a macro are allowed. This behaviour can be controlled using the directive:
#pragma TenDRA extra macro definition allow
The ISO C/C++ rules for determining whether two macro definitions are consistent are fairly restrictive. A more relaxed rule allowing for consistent renaming of macro parameters can be enabled using:
#pragma TenDRA weak macro equality allow
In the definition of macros with parameters, a #
in the replacement list must be followed by a parameter name, indicating the stringising operation. This behaviour can be controlled by the directive:
#pragma TenDRA no ident after # allow
which allows a #
which is not followed by a parameter name to be treated as a normal preprocessing token.
In a list of macro arguments, the effect of a sequence of preprocessing tokens which otherwise resembles a preprocessing directive is undefined. The C++ producer treats such directives as normal sequences of preprocessing tokens, but can be made to report such behaviour using:
#pragma TenDRA directive as macro argument allow