Main Content

MISRA C++:2023 Rule 19.3.1

The # and ## preprocessor operators should not be used

Since R2024b

Description

Rule Definition

The # and ## preprocessor operators should not be used.

Rationale

The evaluation of the # and ## preprocessor operators does not have a specified execution order. Different compilers might evaluate these operators in different order of execution. The uncertainty of execution order might result in developer confusion or unexpected macro calculations. When possible, avoid using the # and ## preprocessor operators.

Polyspace Implementation

Polyspace ®raises this advisory when the # or ## operators are used in a macro definition.

Troubleshooting

If you expect a rule violation but Polyspace does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

#define STRING(X) { #X }                          //noncompliant
#define CONCAT(X, Y) {X ## Y}                     //noncompliant

Because the macro STRING(X) uses the # operator, Polyspace flags the macro as noncompliant.

Polyspace flags the macro CONCAT(X, Y) as noncompliant because it uses the ## operator.

Check Information

Group: Preprocessing Directives
Category: Advisory

Version History

Introduced in R2024b