38 lines
1.3 KiB
Plaintext
38 lines
1.3 KiB
Plaintext
![]() |
C provides a way of defining or aliasing a type through <code>typedef</code>. On top of it, C++ adds <code>using</code> 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. <code>typedef</code> and <code>using</code> 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 <code>typedef</code> or <code>using</code>.
|
|||
|
|
|||
|
|
|||
|
== 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
|
|||
|
|