JPCERT コーディネーションセンター

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

自動検出
ツール バージョン チェッカー 説明

ECLAIR

1.2

CC2.PRE03

実装済み

LDRA tool suite

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)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter