Main Content

MISRA C++:2023 Rule 19.3.3

The argument to a mixed-use macro parameter shall not be subject to further expansion

Since R2024b

Description

Rule Definition

The argument to a mixed-use macro parameter shall not be subject to further expansion. 1

Rationale

The parameter to # or ## is not expanded prior to being used. The same parameter appearing elsewhere in the replacement text is expanded. If the macro parameter is itself subject to macro replacement, its use in mixed contexts within a macro replacement can result in unexpected behavior.

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

In this example, because of multiple levels of macro replacement, the macro NORMALIZE(MYVAR) expands to (VAR2)/MYVAR_max instead of (VAR2)/VAR2_max. Polyspace reports a violation.

#include <iostream>

// Define a macro with a mixed-use parameter
#define NORMALIZE(X) (X/X##_max)

int var_max;
int var;
int normalized = NORMALIZE(var); //Compliant

#define MYVAR VAR2

int MYVAR_max;
int VAR2;
int VAR2_max;
int NV = NORMALIZE(MYVAR);//Noncompliant

Check Information

Group: Preprocessing Directives
Category: Required

Version History

Introduced in R2024b


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.