#pragma例を挙げて、Cでのいくつかの用途は何ですか?
10 に答える
#pragmaマシン固有またはオペレーティング システム固有のコンパイラ ディレクティブ用です。つまり、すべてのマシンおよびオペレーティング システムに適用される場合と適用されない場合があります。システム。
詳細については、 msdnを参照してください。
#pragmaC で実装固有の何かを行うために使用されます。つまり、イデオロギー的に独断的ではなく、現在のコンテキストに対して実用的です。
私が定期的に使用するのは#pragma pack(1)、組み込みソリューションでメモリ空間をさらに絞り込もうとしている場所です。それ以外の場合は 8 バイト アラインメントになってしまう構造体の配列を使用します。
残念#dogmaながらまだありません。楽しそう ;)
#pragmas はコンパイラに大きく依存し、移植性がないため、一般的には #pragmas の使用をできるだけ避けようとします。それらを移植可能な方法で使用したい場合は、すべてのプラグマを#if/#endifペアで囲む必要があります。GCC はプラグマの使用を推奨しておらず、実際には他のコンパイラとの互換性のためにプラグマの一部のみをサポートしています。GCC には、他のコンパイラがプラグマを使用するのと同じことを行う別の方法があります。
たとえば、MSVC で構造体が密にパックされている (つまり、メンバー間にパディングがない) ことを確認する方法は次のとおりです。
#pragma pack(push, 1)
struct PackedStructure
{
char a;
int b;
short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7
GCC で同じことを行う方法は次のとおりです。
struct PackedStructure __attribute__((__packed__))
{
char a;
int b;
short c;
};
// sizeof(PackedStructure == 7)
GCC コードはより移植性が高く、GCC 以外のコンパイラでコンパイルしたい場合は、
#define __attribute__(x)
一方、MSVC コードを移植する場合は、各プラグマを#if/#endifペアで囲む必要があります。かわいくない。
#pragma onceヘッダー ファイルの先頭に置くことで、一度だけインクルードされるようになります。#pragma onceこれは標準の C99 ではありませんが、最近のほとんどのコンパイラでサポートされていることに注意してください。
別の方法として、インクルード ガードを使用することもできます (例: #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */) 。
私が感じている#pragmaのは、コードを場所固有にしたい場合、たとえばISRが書き込まれている特定のアドレスからプログラムカウンターを読み取らせたい場合は、その場所でISRを指定できます#pragma vector=ADC12_VECTOR。割り込みrotinesの名前とその説明
プラグマは実装固有のものであるため、コンパイラのドキュメントを参照することをお勧めします。たとえば、組み込みプロジェクトでは、コードとデータをさまざまなセクションに配置したり、割り込みハンドラーを宣言したりするためにそれらを使用しました。すなわち:
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
これは、特定の機能をオンまたはオフにするために使用できるプリプロセッサ ディレクティブです。
と の 2 種類#pragma startupが#pragma exitあり#pragma warnます。
#pragma startupプログラムの起動時に呼び出される関数を指定できます。
#pragma exitプログラムの終了時に呼び出される関数を指定できます。
#pragma warn警告を抑制するかどうかをコンピュータに指示します。
#pragmaコンパイラを制御するために、他の多くのスタイルを使用できます。
#pragma startupメイン関数の前に関数を呼び出し、メイン関数の後に別の関数を呼び出すために使用されるディレクティブです。
#pragma startup func1
#pragma exit func2
ここでは、func1前mainにfunc2実行し、後で実行します。
注: このコードは、Turbo-C コンパイラでのみ機能します。GCC でこの機能を実現するには、次のように宣言func1します。func2
void __attribute__((constructor)) func1();
void __attribute__((destructor)) func2();