プログラミング言語 C の新機能 Part VIII: CPP#5:どこでもプラグマ
(1999/04/25 [日])
プラグマはベンダが勝手に定義していくもので、もちろん標準化はされていません。しかし、ベンダ間で同じような機能を持つプラグマが異なった表記法によって定義されることがあります。例えば、そのマシンで多少制限はあるがより高速に呼び出す方法があるとしましょう。このプラグマは直後の関数一つを修飾するものとします。このような場合、移植性のあるソースプログラムにするには、プラグマを次のように使用するしかありませんでした。
pragma を使用するたびにこのような表記法を使用する必要があります。しかし、この表記ではソースプログラムが非常に見づらくなります。では、より簡単にするために、#if ... #endif の間を別のファイルにして、それを #include するという方法も考えられます。しかしそれぞれのプラグマ用のファイルを作成するのは管理と手間の上で面倒で、しかも美しくありません。今度のプリプロセッサから使用できるプリプロセッサ _Pragma 単項演算子を使用するとこのような問題を解決することができます。
このように、簡潔に記述することができるようになります。なお、_Pragam の引数に書けるのは文字列定数だけです。つまり、_Pragma("プラグマ指令") という表記だけです。
/* * cpp: 従来の #pragma の使用例 (c)1999 seclan * ver1.00 1999/04/25 最初のバージョン */ //ここから: 関数毎に記述する必要がある #if defined(ARCHITECTURE_A) #pragma call_func_fast #elif defined(ARCHITECTURE_B) #pragma fastcall #elif defined(ARCHITECTURE_C) #pragma __fastcall #endif //ここまで int func(int val) { ... } //ここから: また記述する必要がある #if defined(ARCHITECTURE_A) #pragma call_func_fast #elif defined(ARCHITECTURE_B) #pragma fastcall #elif defined(ARCHITECTURE_C) #pragma __fastcall #endif //ここまで: int foo_bar(int val) { ... } |
pragma を使用するたびにこのような表記法を使用する必要があります。しかし、この表記ではソースプログラムが非常に見づらくなります。では、より簡単にするために、#if ... #endif の間を別のファイルにして、それを #include するという方法も考えられます。しかしそれぞれのプラグマ用のファイルを作成するのは管理と手間の上で面倒で、しかも美しくありません。今度のプリプロセッサから使用できるプリプロセッサ _Pragma 単項演算子を使用するとこのような問題を解決することができます。
/* * cpp: _Pragma 演算子の使用例 (c)1999 seclan * ver1.00 1999/04/25 最初のバージョン */ //ここから: config.h などに定義しておく #if defined(ARCHITECTURE_A) #define pragma_fastcall _Pragma("call_func_fast") #elif defined(ARCHITECTURE_B) #define pragma_fastcall _Pragma("fastcall") #elif defined(ARCHITECTURE_C) #define pragma_fastcall _Pragam("__fastcall") #else #define pragma_fastcall #endif //ここまで pragma_fastcall int func(int val) //pragma_fastcall で簡単に使用できる { ... } pragma_fastcall int foo_bar(int val) //pragma_fastcall で指定できる { ... } |
このように、簡潔に記述することができるようになります。なお、_Pragam の引数に書けるのは文字列定数だけです。つまり、_Pragma("プラグマ指令") という表記だけです。
by seclan