|
言語拡張ANSI C プログラミング言語の規格と、より新しい C++ 言語の規格が確立されていますが、数多くの既存 C / C++ ソフトウェアは、これらの規格を満たしていません。この原因の1つには(C 言語の K&R の時期のように)言語の仕様が最終的に決定される前にソフトウェアが書かれているためであり、また、コンパイラが形式言語への拡張をサポートしていることにも起因します。Imagix 4D アナライザは、こうした既存のコードに幅広く対応するために開発されました。 多くの場合、このサポートは自動的に行われます。Imagix 4D アナライザはソフトウェアを解析する上で、数多くの歴史的な言語の構文を認識します。例えば、古い K&R 形式の条件付きコンパイル・ディレクティブ(#if 0)や 新しい C++ 形式のコメント(//)も、C コードの解析でサポートします。また、同アナライザは、さまざまなコンパイラ固有の言語拡張もサポートしています。一例をあげると、一部の VAX コンパイラおよびクロスコンパイラで使用が認められている、シンボル名の中における文字 $ (na$me)にも対応します。 キーワード拡張のケースでは、Imagix 4D プリプロセッサがソースファイルを適切な C / C++ ソースコードに変換するために、マクロ定義を使用する必要があります。具体的には、多くの C クロスコンパイラは ANSI C で定義されていなくても、キーワード near ならびに far をサポートします。 このような場合には、near や far を空の文字列に置換するマクロ定義を作成する方法があります。これにより効率的に Imagix 4D アナライザは、コードの中に存在するそれらのキーワードを無視します。 こうしたマクロ置換を定義するには、それらをコンパイラ設定ファイルに記述することが最善の手法です。そうすることでサポートするコンパイラごとに、前述のような定義を一度作成するだけで済み、修正作業も容易になります。 ../imagix/user/cc_cfg ディレクトリにある .inc ファイルに参考例が記載されていますので、参照してください。特に bor_win.inc および msvc_win.inc ファイルには、そのようなマクロ定義が数多く記述されています。 一部の言語拡張は、このような方法では定義することができないため -gnu、-msc の情報のように、アナライザ・オプションを使用する特別な処理が必要となります(本 ユーザガイド の「アナライザの構文とオプション」のページを参照)。 これらのオプションは "#pragma cmdflag -msc" などの行を追記することにより、コンパイラ設定ファイルに固定的に組み込むことが可能です。
インライン・アセンブラ特別な処理を必要とする言語拡張には、必ずインライン・アセンブラコードが含まれます。多くのコンパイラは、C / C++ ソースファイルへのアセンブラコードの記述をサポートします。Imagix 4D アナライザはインライン・アセンブラの解釈を試みませんが、その周辺にある C / C++ コードを解析する上で、インライン・アセンブラによる問題が生じないよう特別な措置を取ります。インライン・アセンブラが言語仕様から外れていることを理由の1つとし、コードの特定の行が C / C++ ではなくインライン・アセンブラであることを示すために、多くの異なった構文が生成されます。これらの構文の一部は、いかなる状況においても Imagix 4D アナライザによって、自動的に処理されます。これ以外の構文は、言語の他の部分と矛盾する可能性を潜在的に秘めているため、特定のアナライザ・オプションが使用されるときに限りサポートされます。 Imagix 4D アナライザは常に、以下のフォーマットの単一行をスキップします。
#asm (....) #asm <...> #asm "..."同様に、以下の複数行にわたる構文も、常時アナライザによってスキップされます。
#asm
... 任意の行数 ...
#endasm
#pragma asm
... 任意の行数 ...
#pragma endasm
asm {
... 任意の行数 ...
}
-noendasm オプションを使用する場合を除き、次の行はスキップされます。
#asm anything else on this lineただし #asm と #endasm の間の行はスキップされません。 多くのコンパイラは、インライン・アセンブラで実行する関数の本文がある関数定義を、ソースファイルに記述することができます。一般的に使用されるフォーマットは、次の通りです。
ASM declarator_part declaration_list {
... 任意の行数 ...
}
こうした関数定義のサポートは、declarator_part の関数名の認識も含め、-asm、-asm2、-c11、-gnu、-lnx アナライザ・オプションを使用することで有効となります。キーワード ASM は -asm、-asm2、-c11 オプションの使用時は "asm" となり、-gnu、-lnx オプションの使用時は "__asm" となり、-msc オプションの使用時は "_asm" または "__asm" になります。このキーワードサポートは、-D オプションを使用するか、あるいはコンパイラ設定ファイルに #define 文を記述の上、マクロ定義を利用することで拡張することが可能です。例えば、"-D_asm=asm" オプションと -asm オプションを組み合わせて使用すれば、キーワードASM は "_asm" でも "asm" でも問題ありません。
もう1つ、数多くのコンパイラによってサポートされる一般的な構文があります。これはインラインアセンブラのブロックが関数の内部で使用されるものです。いくつかの形式で利用可能です:
ASM OPTvolatile {
... 任意の行数 ...
}
ASM OPTvolatile (
... 任意の行数 ...
)
この構文は、OPTvolatileの後に「{」または「(」が続かない場合、単一行形式でも使用されます:
ASM OPTvolatile ...Imagix 4Dのアナライザは、関数定義で使用されるのと同じオプション(-asm、-asm2、-c11、-gnu、-lnx、-msc)を通じて、これらのインラインコードブロックのサポートを有効にします。ASMキーワードは、上記のオプションに応じて「asm」、「_asm」または「__asm」を表します。OPTvolatileキーワードは「volatile」または「goto」であるか、または省略することができます。 単一行形式では、アセンブリコードは行の終わりまで続くと見なされます。-asm2が使用され、単一行の終わりまでに「;」が現れる場合、「;」はアセンブリコードの終わりとして扱われ、「;」の後のコードはC / C++コードとして解析されます。
|