いくつかの用途は何ですか#pragma
Cでの例を挙げて、?
いくつかの用途は何ですか#pragma
Cでの例を挙げて、?
回答:
#pragma
マシン固有またはオペレーティングシステム固有のコンパイラディレクティブ用です。つまり、すべてのマシンとオペレーティングに適用されるかどうかに関係なく、何かを行う、オプションを設定する、何らかのアクションを実行する、デフォルトをオーバーライドするなど、コンパイラに指示します。システム。
詳細については、msdnを参照してください。
#pragma
Cで実装固有の何かを行うために使用されます。つまり、イデオロギー的に独断的ではなく、現在のコンテキストに対して実用的です。
私が定期的に使用しているのは#pragma pack(1)
、組み込みソリューションでメモリ空間をさらに絞り出そうとしているところです。そうしないと、構造体の配列が8バイトアライメントになってしまいます。
#dogma
まだ残念です。楽しそう ;)
pragma(1)
速度も大幅に向上しませんか?stackoverflow.com/questions/3318410/…を
#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
ペアで囲む必要があります。きれいじゃない。
struct __attribute__((__packed__)) PackedStructure
hack
-を参照して、それが認識されないプラグマに遭遇したとき、それは非常に、非常に長い時間前にすると、一度行うために使用されるように#pragma
し、GCCなど)
プラグマは本質的に実装固有であるため、私の最善のアドバイスはコンパイラのドキュメントを確認することです。たとえば、組み込みプロジェクトでは、それらを使用してコードとデータを別のセクションに配置したり、割り込みハンドラーを宣言したりしました。つまり:
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
上記のすべての答えは良い説明です#pragma
が、小さな例を追加したかった
私simple OpenMP example
は#pragma
その仕事をするためのいくつかの使用法を示すことを説明したいだけです
OpenMPのは
briefly
(そして、我々はそれがだと言うことができますマルチプラットフォーム共有メモリ並列プログラミングのための実装ですmachine-specific
かoperating-system-specific
)
例に行きましょう
#include <stdio.h>
#include <omp.h>// compile with: /openmp
int main() {
#pragma omp parallel num_threads(4)
{
int i = omp_get_thread_num();
printf_s("Hello from thread %d\n", i);
}
}
出力は
Hello from thread 0
Hello from thread 1
Hello from thread 2
Hello from thread 3
Note that the order of output can vary on different machines.
今何を#pragma
したか教えてみましょう...
4スレッドでコードのブロックを実行するようにOSに指示します
これはmany many applications
あなたが少しでできることの1つにすぎません#pragma
外側のサンプルで申し訳ありません OpenMP
これは、特定の機能をオンまたはオフにするために使用できるプリプロセッサディレクティブです。
これは、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();
それを合計するには、#pragma
ものを行うようにコンパイラに指示します。ここに私がそれを使用するいくつかの方法があります:
#pragma
コンパイラの警告を無視するために使用できます。たとえば、暗黙的な関数宣言についてGCCをシャットダウンするには、次のように記述します。
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
古いバージョンのlibportable
は、これを移植可能に実行します。
#pragma once
、ヘッダーファイルの先頭に記述した場合、そのヘッダーファイルは一度だけインクルードされます。プラグマを一度サポートするlibportable
かどうかをチェックします。
#pragma
ディレクティブは前処理段階を乗り越えます。異なり#include
と#define
。