Posts: 632
Threads: 18
Joined: Jan 2006
Reputation:
1
The # preprocessing token in this example is not an instance of the # operator (see C90 Section 6.8.3.2) because this is an object-like macro definition, i.e. there are no macro parameters. Therefore, this code complies with Rule 19.13 as well as Rule 2.1 (encapsulation of assembly language). Of course, it would still require a deviation against Rule 1.1 as the asm keyword is a language extension.
If the example had used a function-like macro definition, then the code would not be compliant with Rule 19.13 as the # token would be a # operator.
Posted by and on behalf of the MISRA C Working Group
Posts: 632
Threads: 18
Joined: Jan 2006
Reputation:
1
The presence of a parenthesised, possibly empty, parameter list in the definition of a macro makes it a function-like macro. See the C90 standard, Section 6.8.3.
This means that all of:
Code:
#define QWER(x) { asm x ASDF #$7F; }
#define QWER(x) { asm ASDF #$7F; }
#define QWER() { asm ASDF #$7F; }
are function-like macros and therefore contain instances of the # preprocessing operator.
The # preprocessing operator
must be followed by a parameter (constraint C90 Section 6.8.3.2). Therefore none of the above examples is legal C.
Posted by and on behalf of the MISRA C Working Group