1.4 コンパイラの使用
1.4.4 プラグマ
-o
オプション:
-o file 引数:
出力ファイルの名前。ファイル名はオプションの直後に続けられません。オプションの後にタブまたは スペースを入れる必要があります。
デフォルト:
.src接尾辞を持つモジュール名。
説明:
.src接尾辞を持つモジュール名の代わりに、fileを出力ファイル名として使用します。最初に見つ かった-oオプションが最初にコンパイルするファイルに適用され、2番目の-oオプションが2番目のコ ンパイルファイルに適用されるという具合になるため、このオプションを使用するときは、特に注意 が必要です。
例:
次のコマンドが指定された場合、
c88 file1.c file2.c -o file3.src -o file2.src
file1.cがコンパイルされてfile3.srcが作成され、file2.cがコンパイルされてfile2.srcが作成 されて、2つのファイルが作成されます。
-s
オプション:
-s プラグマ:
source 説明:
Cソースコードを、生成されたアセンブラコードとマージして、ファイルに出力します。
例:
c88 -s test.c
; test.c:
; 1 |int i;
; 2 |
; 3 |int
; 4 |main( void )
; 5 |{
extern __START global _main 参照:
-w
オプション:
-w[num]
引数:
オプションで、抑制する警告番号。
説明:
-wを使用すると、すべての警告メッセージが抑制されます。-wnumを使用すると、指定された警告メッ セージが抑制されます。
例:
警告135を抑制するときは、次のコマンドを実行します。
c88 file1.c -w135
1.4.3 インクルードファイル
インクルードファイルは、<>で囲む方法と""で囲む方法の2つの方法で指定することができます。#include指 示文がある場合、c88は次のアルゴリズムを使用して、インクルードファイルをオープンしようとします。
1. ファイル名が""で囲まれていて、そのファイル名が絶対パス名でない("¥"が最初に付かない)場合、イン クルードファイルは、#include行を含むファイルがあるディレクトリで検索されます。例を示します。
c88 ..¥..¥source¥test.c
c88は、最初にディレクトリ..¥..¥sourceでインクルードファイルを探します。
このファイル(c88 test.c)があるディレクトリでソースファイルをコンパイルする場合、コンパイラは、
インクルードファイルをカレントディレクトリで探します。
ただし、この最初の手順は、<>で囲まれたインクルードファイルでは実行されません。
2. -Iオプションで指定されたディレクトリを、左から右の順序で使用します。例を示します。
c88 -I..¥..¥include demo.c
3. 環境変数C88INCがあるかどうかチェックします。この環境変数がある場合、その内容を、インクルー ドファイルのディレクトリ指定子として使用します。環境変数C88INCでは、区切り文字を使用して複 数のディレクトリを指定することができます。上記の例で-Iオプションを使用する代わりに、次のよう にC88INCを使用して、同じディレクトリを指定することができます。
set C88INC=..¥..¥include c88 demo.c
4. 上記の方法で探してもインクルードファイルが見つからない場合、コンパイラはサブディレクトリ include(c88バイナリが含まれるディレクトリの1つ上のディレクトリ)を探します。例を示します。
c88.exeがディレクトリC:¥C88¥BINにインストールされている場合、インクルードファイルが検索 されるディレクトリは、C:¥C88¥INCLUDEになります。
コンパイラは、このincludeディレクトリを探すため、実行時にバイナリがどのディレクトリから実行 されているかを判断します。
c88は、必要な場合、ディレクトリ区切り文字を適宜挿入するため、-IオプションまたはC88INCで指定され ているディレクトリ名の最後には、この区切り文字を付けても付けなくてもかまいません。
環境変数C88INCで複数のディレクトリを指定する場合、次の区切り文字を使用する必要があります。
; , スペース
例: set C88INC=..¥..¥include;¥proj¥include
1.4.4 プラグマ
ANSI(3.8.6)によると、次の形式で記述された前処理の指示文がある場合、
#pragma pragma-token-list new-line
コンパイラは、インプリメンテーションで定義されている方法で動作します。コンパイラは、以下のリス トにないプラグマについては無視します。プラグマは、コンパイラのコードジェネレータに指示を与えま す。プラグマの他に、コード生成プロセスを進行させる方法として、Cアプリケーションで使用するコマン ド行オプションとキーワード(たとえば_near型変数)があります。コンパイラは、次の規則を使用して、
これらの3つのグループを認識します。
コマンド行オプションより、キーワードとプラグマが優先されます。キーワードより、プラグマが優先さ れます。つまりプラグマの優先度がもっとも高いということになります。
このアプローチを利用すると、ソースモジュールのデフォルト最適化レベルを設定して、ソース内でプラ グマにより一時的に無効とすることもできます。
Cコンパイラc88は、次のプラグマをサポートしています。
asm その次の行(プリプロセッサ行以外)をアセンブラ言語ソースコードとして出力ファイルに挿 入します。挿入された行については、構文がチェックされません。また、ピープホールオプ ティマイザのコードバッファがフラッシュされます。そのため、コンパイラはピープホール パターン置換のような最適化を停止して、endasmプラグマの後、関数の最初で開始するかの ようにこれらの最適化を再開します。高度なアセンブラインラインについては、組み込み関 数を使用することができます。定義された組み込み関数のセットは、S1C88特有の機能のほ とんどをカバーしており、それ以外の方法ではC言語でアクセスすることはできません。組 み込み関数の詳細については、"1.2.16 組み込み関数"を参照してください。
asm_noflush プラグマasmとほとんど同じですが、ピープホールオプティマイザがコードバッファをフラッ
シュせず、レジスタの内容を有効と見なす点が異なります。
endasm C言語に戻します。"1.2.14 アセンブラの記述"で詳細に説明しています。
source -sオプションと同じです。Cソースとアセンブラソースを混在できるようにします。
nosource デフォルト。アセンブラコード内のCソースの生成をオフにします。