MISRA Discussion Forums

Full Version: Rule 2.4 and forward declarations
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Would the use of tags for forward declarations be considered a failure of this rule, if used such as
Code:
struct test;
typedef struct test test_T;

typedef bool (*Callback_T)(test_T const * p_test);

struct test
{
    uint32_t var;
    Callback_T callback;
};
For consistency in type usage, I would prefer to utilize the typedef whenever referring to this structure, including in the callback definition, but this leads our analysis tools to flag that "test" is only used in the typedef.
The use of tag in a typedef is not a violation of rule 2.4, unless the only occurrence of the tag appears in the typedef declaration.
Code:
struct A { ... };                 // compliant
typedef struct A Atype;  
Atype ax;                                  
     // no subsequent use of identifier "A"  

typedef struct B { ... } Btype;  // non-compliant
Btype bx;                              
    // no subsequent use of identifier "B"

typedef struct { ... } Ctype;   // compliant
Ctype cx;
Quote:unless the only occurrence of the tag appears in the typedef declaration.

That is the primary concern. There are no other uses of "test"; all other references to the structure are through the typedef, test_T.

The circular dependency between Callback_T and the structure test complicates these definitions. The example given allows all references to the structure test to be done through the typedef test_T, but is flagged as a violation because test is not used beyond the snippet given.