C and C++


LANG.PREPROC.UMIF : Undefined Macro in #if

Summary

An identifier in the controlling expression of a preprocessor #if or #elif statement has not been previously defined with #define.

Properties

Class Name Undefined Macro in #if
Significance style
Mnemonic LANG.PREPROC.UMIF
Categories
MisraC2023 MisraC2023:20.9 All identifiers used in the controlling expression of #if or #elif preprocessing directives shall be #define'd before evaluation
Misra2012 Misra2012:20.9 All identifiers used in the controlling expression of #if or #elif preprocessing directives shall be #define'd before evaluation
Misra2004 Misra2004:19.11 All macro identifiers in preprocessor directives shall be defined before use, except in #ifdef and #ifndef preprocessor directives and the defined() operator
AUTOSARC++14 AUTOSARC++14:M16-0-7 Undefined macro identifiers shall not be used in #if or #elif pre-processor directives, except as operands to the defined operator.
MisraC++2008 MisraC++2008:16-0-7 Undefined macro identifiers shall not be used in #if or #elif preprocessor directives, except as operands to the defined operator.
MisraC++2023 MisraC++2023:19.1.3 All identifiers used in the controlling expression of #if or #elif preprocessing directives shall be #define'd at the point of evaluation
Availability Available for C and C++.
Enabling Checks for this warning class are disabled by default. To enable them, add the following WARNING_FILTER rule to the project configuration file.
WARNING_FILTER += allow class="Undefined Macro in #if"

Example

For the sake of this example, we assume that THREE and FOUR are not defined at an earlier point in the program, or in the build command.

#define ONE 1
#define TWO 2

#if TWO > ONE                                /* both identifiers are defined macros */
/* ... */
#endif 

#if THREE > ONE /* 'Undefined Macro in #if' warning issued here: THREE not defined. */
/* ... */                                     
#endif

#if FOUR > ONE  /* 'Undefined Macro in #if' warning issued here: FOUR defined, but not until later. */
/* ... */                                     
#endif
#define FOUR 4

#if 2 > 1                                    /* no identifiers */
/* ... */
#endif

static int two=2;
#if two > ONE   /* 'Undefined Macro in #if' warning issued here: two not defined with #define */
/* ... */
#endif

Relevant Configuration File Parameters

The following configuration file parameters affect checks for this warning class.