C provides a way of defining or aliasing a type through ``++typedef++``. On top of it, {cpp} 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 ); ---- == See * https://wiki.sei.cmu.edu/confluence/display/c/PRE03-C.+Prefer+typedefs+to+defines+for+encoding+non-pointer+types[CERT, PRE03-C.] - Prefer typedefs to defines for encoding non-pointer types