125

#pragma例を挙げて、Cでのいくつかの用途は何ですか?

4

10 に答える 10

74

#pragmaマシン固有またはオペレーティング システム固有のコンパイラ ディレクティブ用です。つまり、すべてのマシンおよびオペレーティング システムに適用される場合と適用されない場合があります。システム。

詳細については、 msdnを参照してください。

于 2008-10-24T08:03:12.230 に答える
58

#pragmaC で実装固有の何かを行うために使用されます。つまり、イデオロギー的に独断的ではなく、現在のコンテキストに対して実用的です。

私が定期的に使用するのは#pragma pack(1)、組み込みソリューションでメモリ空間をさらに絞り込もうとしている場所です。それ以外の場合は 8 バイト アラインメントになってしまう構造体の配列を使用します。

残念#dogmaながらまだありません。楽しそう ;)

于 2008-10-24T08:00:34.247 に答える
38

#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ペアで囲む必要があります。かわいくない。

于 2008-10-25T04:57:37.927 に答える
17

#pragma onceヘッダー ファイルの先頭に置くことで、一度だけインクルードされるようになります。#pragma onceこれは標準の C99 ではありませんが、最近のほとんどのコンパイラでサポートされていることに注意してください。

別の方法として、インクルード ガードを使用することもできます (例: #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */) 。

于 2008-10-24T07:58:38.387 に答える
7

私が感じている#pragmaのは、コードを場所固有にしたい場合、たとえばISRが書き込まれている特定のアドレスからプログラムカウンターを読み取らせたい場合は、その場所でISRを指定できます#pragma vector=ADC12_VECTOR。割り込みrotinesの名前とその説明

于 2012-11-30T05:56:13.420 に答える
6

プラグマは実装固有のものであるため、コンパイラのドキュメントを参照することをお勧めします。たとえば、組み込みプロジェクトでは、コードとデータをさまざまなセクションに配置したり、割り込みハンドラーを宣言したりするためにそれらを使用しました。すなわち:

#pragma code BANK1
#pragma data BANK2

#pragma INT3 TimerHandler
于 2008-10-25T04:47:56.323 に答える
3

これは、特定の機能をオンまたはオフにするために使用できるプリプロセッサ ディレクティブです。

と の 2 種類#pragma startup#pragma exitあり#pragma warnます。

#pragma startupプログラムの起動時に呼び出される関数を指定できます。

#pragma exitプログラムの終了時に呼び出される関数を指定できます。

#pragma warn警告を抑制するかどうかをコンピュータに指示します。

#pragmaコンパイラを制御するために、他の多くのスタイルを使用できます。

于 2014-06-05T09:27:30.313 に答える
3

#pragma startupメイン関数の前に関数を呼び出し、メイン関数の後に別の関数を呼び出すために使用されるディレクティブです。

#pragma startup func1
#pragma exit func2

ここでは、func1mainfunc2実行し、後で実行します。

注: このコードは、Turbo-C コンパイラでのみ機能します。GCC でこの機能を実現するには、次のように宣言func1します。func2

void __attribute__((constructor)) func1();
void __attribute__((destructor)) func2();
于 2016-02-03T20:53:45.747 に答える