Main Content

MISRA C++:2023 Rule 19.3.2

A macro parameter immediately following a # operator shall not be immediately followed by a ## operator

Since R2024b

Description

Rule Definition

A macro parameter immediately following a # operator shall not be immediately followed by a ## operator.

Rationale

The evaluation of the # and ## preprocessor operators does not have a specified execution order. In the case where the # operator is executed first, the argument of this operator is converted into a string literal, which is unlikely to result in a valid token when pasted to another token by the ## operator.

Polyspace Implementation

The coding rule checker reports a violation if a ## follows the argument of a # operator 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 }                          // Compliant
#define CONCAT(X, Y) {X ## Y}                     // Compliant
#define STRING_CONCAT(x, y) {#x ## y}             // Noncompliant

Polyspace reports a violation for the STRING_CONCAT macro because the ## operator follows the argument of the # operator.

Check Information

Group: Preprocessing Directives
Category: Required

Version History

Introduced in R2024b