This diagnostic rule is based on the MISRA (Motor Industry Software Reliability Association) manual for software development.
Conditional compilation directives '#else', '#elif' and '#endif' must be in the same file as the '#if', '#ifdef' or '#ifndef' to which they refer. Non-compliance with this rule makes code more difficult to read. Besides, this increases the probability of a mistake when you edit and maintain code.
Note: it is impossible to make this error in modern compilers. Incorrect use of conditional compilation directives in these compilers leads to compile-time errors.
Look at the example:
#define Check_A 10
#ifdef Check_A // <=
#if Check_A > 5
static int a = 5;
#elif Check_A > 2
static int a = 2;
#else
static int a = 0;
#endif // <=
int main(void)
{
return a;
}
In the first example a nested condition that consists of '#ifdef' and '#if' is used. At the end of the fragment the second conditional compilation directive ('#if') is closed, but '#ifdef' remains open. This can create incorrect code.
Look at another example:
/* File.h */
#ifdef Check_B
#include "SomeOtherFile.h" // <=
/* End of File.h */
In this example the conditional compilation directive is not closed. If you include this file in others using the '#include' preprocessor directive, this can lead to subtle errors.
This diagnostic is classified as:
|