#pragma 語彙
#pragmaコマンドは、コンパイラに対して特殊なことをするように伝えるというのを可能にします。#pragmaコマンドは実装依存であるため、コンパイラによって使える語彙などはさまざまんです。プログラムの実行をトレースするようなオプションもある場合があるでしょう。
これからいくつかpragma命令について説明していきますが、あるコンパイラファミリーの、あるOSに限定されたものであり、実装されているもののごく一部です。
pragmaは、main()関数が呼ばれる前、もしくは終了後に何か関数を呼び出したい場合にも使用されます。
#pragma startup fun() //この関数の返り値の型はvoidでパラメータは持ってはいけません #pragma exit fun1()
#pragma redefine_extname printf prnt
アセンブリ言語に変換される段階で、C言語の関数名を指定された別のシンボルに置き換えます。
#pragma extern_prefix ext_ // プリフィックス付与スタート // ここで定義された外部に公開された(external)シンボルはアセンブリレベルでプリフィックスが付与されます #pragma extern_prefix // プリフィックス付与終了
すべての外部に公開された関数のアセンブリシンボルに対して、指定された文字列のプリフィックスを与えます。#pragma extern_prefixが現れると、そこで外部に公開されたシンボルに対するプリフィックスの付与は終了します。
#pragma pack(64) // この宣言以降に宣言されるクラス、共用体、構造体は64ビットコードに対して最適化されます
パッキングというのは最適化の手法の一つで、構造体やクラス、共用体のメンバー変数がパッキングの境界に並ぶようになるというものです。これを行うと、プロセッサがデータを取り扱うビット数の単位に配列されてパックされるようになるため、データアクセスが簡単になって、結果として高速になります。欠点としては不要なゴミデータがパックされるときのすきまに割り当てられるようになるために、メモリのコストが増加するというものがあります。packの引数と指定される数値は、2のn乗の数値(2, 3, 8, 16, 32, 64….)でなければなりません。”pack”には別の使用法があり、それについては後から説明しますが(説明未完)、上記のサンプルコードの使い方がもっともシンプルで、かつ一般的な方法になります。また、この命令は以下のように書くこともできます:
#pragma pack() /* 空のカッコ */
こうすると、コンパイラのデフォルトのパッキング規則にリセットされます。
← #pragma pack(push) and #pragma pack(pop) are on the way, I'm still researching them and their functionality. -/> ← This document is still under construction, I intend to continue adding compilers and their pragma options instead of leaving this largely blank. -GinoMan -/>