PRE03-C. ポインタ型でない型をエンコードするには define よりも typedef を選ぶ
型をエンコードするときは、マクロ定義 (#define
) より 型定義 (typedef
) を選ぶこと。型定義はスコープの規則に従うが、マクロ定義は従わない。マクロ定義によるテキスト置換よりも型システムを活用すべきである。型定義はポインタ型でない型についても有用であるが[Summit 2005]、const
-correct なコードを書くためには注意を要する(「DCL05-C. typedef による型定義ではポインタ型を避ける」を参照)。
違反コード
この違反コード例はコンパイルに失敗する。マクロ定義が展開されるときには、単純にテキスト置換が行われるからだ。
#define MATRIX double matrix[4][4] MATRIX matrix_a;
このコードは、プリプロセッサで変換されると次のような不正な宣言になる。
#define MATRIX double matrix[4][4] double matrix[4][4] matrix_a;
適合コード
マクロ定義ではなく型定義を行うことで、正しい宣言になる。
typedef double matrix[4][4]; matrix matrix_a;
違反コード
次のコード例では、何が悪いのだろう?
#define uchar unsigned char
適合コード
ポインタ型でない型については、マクロ定義ではなく型定義を行うようにするとよい。
typedef unsigned char uchar;
リスク評価
レコメンデーション |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
PRE03-C |
低 |
低 |
中 |
P2 |
L3 |
自動検出
ツール | バージョン | チェッカー | 説明 |
---|---|---|---|
1.2 |
CC2.PRE03 |
実装済み |
|
9.5.6 |
79 S |
Enhanced Enforcement |
|
PRQA QA-C | 8.2 | 3413 | 実装済み |
関連するガイドライン
SEI CERT C++ Coding Standard | PRE03-CPP. Prefer typedefs to defines for encoding types |
ISO/IEC TR 24772:2013 | Pre-processor Directives [NMP] |
参考資料
[Saks 1999] | |
[Summit 2005] | Question 1.13 Question 11.11 |
翻訳元
これは以下のページを翻訳したものです。
PRE03-C. Prefer typedefs to defines for encoding non-pointer types (revision 115)