|
前処理コード解析における第1段階は、コンパイラと同様にコードを前処理し、純粋な C / C++ ソフトウェアに変換することです。#define、#ifdef、#include のようなプリプロセッサ・ディレクティブが展開され、 /* と */ で囲われた文字列はコメントとして処理されるため、無視されます。ソースコードを正確に前処理するため、Imagix 4D アナライザには、コンパイラが使用するものと同じ情報が部分的に必要となります。アナライザは、ヘッダファイルを検索する場所を認識する必要があるのです。また、条件付きコンパイル・ディレクティブ(#if、#ifdef など)で使用されるマクロ定義の有無や、マクロが定義されている場合には、どのように定義されているかを識別する必要もあります。 通常、この情報はプリプロセッサ・オプションを使用してコンパイラに渡されます。Imagix4D アナライザも同じ引数を使用するのです。また、インクルード・ディレクトリの指定には、-Idirname(Windows システムでは /Idirname)を使用します。これらのディレクトリでは、リストされている順に、#include 文で参照されるヘッダファイルが検索されます。 さらに、引数 -Dmacroname または -Dmacroname=macrovalue を、コンパイラの場合と同様にマクロを定義するために使用します。これらのマクロ定義は、#ifdef などの条件付きコンパイル・ディレクティブの処理方法を計算するためにも利用されます。また -Umacroname という対照的なオプションもアナライザは認識し、この際にはマクロが未定義となります。 前処理および本処理を両方とも実行することにより、Imagix 4D アナライザはマクロに関する完全な情報を生成することが可能となるのです。以下に例を示します。
/* ファイルの1行目 */ #define macroB(x) funcC(x) void funcA(int x) { int y; y = macroB(x); }アナライザは、funcA が macroB を使用する(呼び出す)という情報とともに、funA が funcC を呼び出すという情報も生成します。さらにデータファイルにも、funcA における macroB ならびに funcC 双方の呼び出しが7行目で発生する、という情報が格納されるのです。この後者の、シンボルが参照される場所に関する情報は、数多くのアプリケーションを対象とし、特に Use Browser のディスプレイでシンボルが使用されている、あらゆる場所を表示する際に使用されます。
|