Why is this an issue?
C provides a way of defining or aliasing a type through typedef
. On top of it, C++ adds using
that can do the same and
more.
Using a macro to define a type is inferior to the previous ways for two reasons:
- macros cannot be enclosed into scopes. Or at least, doing so is cumbersome and error-prone as in that case, the macro needs to be defined and
undefined manually.
- macros are handled by the preprocessor and are not understood from the compiler. They can easily pollute the code in places where types are not
expected.
typedef
and using
are known to the compiler to define types and can be more strictly checked.
As a result, macros should not be used as a replacement to typedef
or using
.
Noncompliant code example
#define UINT unsigned int // Noncompliant
#define INT int // Noncompliant
UINT uabs( INT i );
Compliant solution
typedef unsigned int UINT;
typedef int INT;
UINT uabs( INT i );
or
using UINT = unsigned int;
using INT = int;
UINT uabs( INT i );
Resources
- CERT, PRE03-C. -
Prefer typedefs to defines for encoding non-pointer types