...
Wiki Markup |
---|
In this noncompliant code example, the programmer has written a macro called {{EXEC_BUMP()}} to call a specified function and increment a global counter \[[Dewhurst 02|AA. References#DewhurstBibliography#Dewhurst 02]\]. When the expansion of a macro is used within the body of a function, as in this example, identifiers refer to the declarations in scope where the body occurs. As a result, when the macro is called in the {{aFunc()}} function, it inadvertently increments a local counter with the same name as the global variable. Note that this example also violates [DCL01-C. Do not reuse variable names in subscopes]. |
...
Wiki Markup |
---|
GNU C (and some other compilers) supported inline functions before they were added to C99 and as a result have significantly different semantics. Richard Kettlewell provides a good explanation of differences between the C99 and GNU C rules \[[Kettlewell 03|AA. References#KettlewellBibliography#Kettlewell 03]\]. |
Exceptions
PRE00-EX1: Macros can be used to implement local functions (repetitive blocks of code that have access to automatic variables from the enclosing scope) that cannot be achieved with inline functions.
...
References
Wiki Markup |
---|
\[[FSF 05|AA. References#FSFBibliography#FSF 05]\] Section 5.34, "[An Inline Function Is as Fast as a Macro|http://gcc.gnu.org/onlinedocs/gcc/Inline.html]" \[[Dewhurst 02|AA. References#DewhurstBibliography#Dewhurst 02]\] Gotcha #26, "#define Pseudofunctions" \[[ISO/IEC 9899:1999|AA. References#ISOBibliography#ISO/IEC 9899-1999]\] Section 6.7.4, "Function specifiers" \[[ISO/IEC PDTR 24772|AA. References#ISOBibliography#ISO/IEC PDTR 24772]\] "NMP Pre-processor Directives" \[[Kettlewell 03|AA. References#KettlewellBibliography#Kettlewell 03]\] \[[MISRA 04|AA. References#MISRABibliography#MISRA 04]\] Rule 19.7 \[[Summit 05|AA. References#SummitBibliography#Summit 05]\] Question 10.4 |
...