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 by 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 for 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 );