rspec/rules/S5825/cfamily/rule.adoc

53 lines
1.5 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

== Why is this an issue?
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 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
[source,cpp]
----
#define UINT unsigned int // Noncompliant
#define INT int // Noncompliant
UINT uabs( INT i );
----
=== Compliant solution
[source,cpp]
----
typedef unsigned int UINT;
typedef int INT;
UINT uabs( INT i );
----
or
[source,cpp]
----
using UINT = unsigned int;
using INT = int;
UINT uabs( INT i );
----
== Resources
=== Documentation
* {cpp} reference - https://en.cppreference.com/w/cpp/language/typedef[typedef specifier]
* {cpp} reference - https://en.cppreference.com/w/cpp/language/type_alias[Type alias, alias template]
=== Standards
* CERT - https://wiki.sei.cmu.edu/confluence/display/c/PRE03-C.+Prefer+typedefs+to+defines+for+encoding+non-pointer+types[PRE03-C. Prefer typedefs to defines for encoding non-pointer types]