Was sind einige Verwendungen von #pragma
in C, mit Beispielen?
Verwendung von #pragma in C
Steven A. Lowe
#pragma
ist für Compiler-Direktiven, die maschinenspezifisch oder betriebssystemspezifisch sind, dh es weist den Compiler an, etwas zu tun, eine Option einzustellen, eine Aktion auszuführen, eine Voreinstellung zu überschreiben usw., die für alle Maschinen und Betriebssysteme gelten kann oder nicht Systeme.
Sehen msdn Für mehr Information.
-
“Das kann für alle Maschinen und Betriebssysteme gelten oder nicht.” – und verschiedene Compiler auf derselben Maschine. Und das kann auf verschiedenen Compilern unterschiedliche Dinge bedeuten.
– Steve Jessop
24. Oktober 2008 um 8:22 Uhr
SmacL
#pragma
wird verwendet, um etwas Implementierungsspezifisches in C zu tun, dh eher pragmatisch für den aktuellen Kontext als ideologisch dogmatisch zu sein.
Die, die ich regelmäßig benutze, ist #pragma pack(1)
wo ich versuche, bei eingebetteten Lösungen mehr aus meinem Speicherplatz herauszuholen, mit Arrays von Strukturen, die sonst mit einer 8-Byte-Ausrichtung enden würden.
Schade, dass wir keine haben #dogma
noch. Das würde Spaß machen 😉
-
@ShaneMacLaughlin, nicht
pragma(1)
verbessert tatsächlich auch die Geschwindigkeit? Siehe stackoverflow.com/questions/3318410/…– Schrittmacher
14. Mai 2015 um 16:18 Uhr
-
@ Pacerier, normalerweise nicht. Gemäß den Kommentaren von jalfs werden Daten, die an einer 4-Byte-Grenze für 32-Bit-Prozessoren oder an einer 8-Byte-Grenze für 64-Bit-Prozessoren ausgerichtet sind, normalerweise in einem einzigen Vorgang geladen und gespeichert. Daten, die an kleineren Grenzen ausgerichtet sind, erfordern mehrere Operationen zum Laden oder Speichern. Das ist langsamer.
– SmacL
15. Mai 2015 um 7:34 Uhr
Adam Rosenfeld
Ich würde im Allgemeinen versuchen, die Verwendung von #pragmas nach Möglichkeit zu vermeiden, da sie extrem Compiler-abhängig und nicht portierbar sind. Wenn Sie sie portabel verwenden möchten, müssen Sie jedes Pragma mit einem umgeben #if
/#endif
Paar. GCC rät von der Verwendung von Pragmas ab und unterstützt wirklich nur einige davon, um die Kompatibilität mit anderen Compilern zu gewährleisten; GCC hat andere Möglichkeiten, die gleichen Dinge zu tun, für die andere Compiler Pragmas verwenden.
So stellen Sie beispielsweise sicher, dass eine Struktur in MSVC dicht gepackt ist (d. h. keine Polsterung zwischen Mitgliedern):
#pragma pack(push, 1)
struct PackedStructure
{
char a;
int b;
short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7
So würden Sie dasselbe in GCC tun:
struct PackedStructure __attribute__((__packed__))
{
char a;
int b;
short c;
};
// sizeof(PackedStructure == 7)
Der GCC-Code ist portabler, denn wenn Sie ihn mit einem Nicht-GCC-Compiler kompilieren möchten, müssen Sie nur Folgendes tun
#define __attribute__(x)
Wenn Sie hingegen den MSVC-Code portieren möchten, müssen Sie jedes Pragma mit einem umgeben #if
/#endif
Paar. Nicht hübsch.
-
Wenn ich also den GCC-Code auf MSVC kompilieren möchte und die Struktur packen muss, wie genau mache ich das?
– SmacL
6. Januar 2009 um 12:15 Uhr
-
Für gcc ist es
struct __attribute__((__packed__)) PackedStructure
– Laurent Debricon
26. Juli 2010 um 12:14 Uhr
-
#pragma once ist realistischerweise nicht “compilerabhängig und nicht portierbar”. Es wird auf allen großen Plattformen und vielen nicht großen Plattformen unterstützt. en.wikipedia.org/wiki/Pragma_once#Portability
– xaxxon
21. Juni 2016 um 22:52 Uhr
-
Beachten Sie, dass C99 und C11 beide (C11) enthalten. §6.10.6 Pragma-Direktiven und 1 Ein solches Pragma, das von der Implementierung nicht erkannt wird, wird ignoriert. Sogar C90 sagt das, obwohl es in Abschnitt §6.8.6 stand. (Dies macht GCC nicht konform, wenn es ausgeführt wird
hack
wenn es auf ein Pragma trifft, das es nicht erkennt, wie es vor sehr, sehr langer Zeit einmal der Fall war – sehen Sie#pragma
und GCCetc.)– Jonathan Leffler
22. November 2018 um 4:14 Uhr
-
Die Syntax von GCC ist im Vergleich zu allen anderen Alternativen immer völlig durchgeknallt – schauen Sie sich nur an, was sie mit der Inline-Assemblierung gemacht haben – ugh. Wie auch immer, dieser Augenkrebs wird möglicherweise nicht zum Strukturpacken benötigt – siehe: gcc.gnu.org/onlinedocs/gcc/…
– Christoffer Bubach
18. August 2021 um 17:05 Uhr
Schildmeier
Putten #pragma once
oben in Ihrer Header-Datei stellt sicher, dass sie nur einmal enthalten ist. Beachten Sie, dass #pragma once
ist kein C99-Standard, wird aber von den meisten modernen Compilern unterstützt.
Eine Alternative ist die Verwendung von Include Guards (z #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */
)
sandeep
was ich fühle ist #pragma
ist eine Anweisung, in der Sie, wenn Sie möchten, dass der Code standortspezifisch ist. Sagen Sie eine Situation, in der der Programmzähler von der spezifischen Adresse lesen soll, an der die ISR geschrieben ist, dann können Sie ISR an dieser Stelle angeben #pragma vector=ADC12_VECTOR
und gefolgt vom Namen der Unterbrechungsroutine und ihrer Beschreibung
Nur verliebt
Mein bester Rat ist, sich die Dokumentation Ihres Compilers anzusehen, da Pragmas per Definition implementierungsspezifisch sind. In Embedded-Projekten habe ich sie beispielsweise verwendet, um Code und Daten in verschiedenen Abschnitten zu lokalisieren oder Interrupt-Handler zu deklarieren. dh:
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
Weiß
Alle obigen Antworten sind gute Erklärungen für #pragma
aber ich wollte ein kleines Beispiel hinzufügen
Ich möchte nur a erklären simple OpenMP example
die einige Verwendungen von demonstrieren #pragma
um seine Arbeit zu tun
OpenMp
briefly
ist eine Implementierung für plattformübergreifende Shared-Memory-Parallelprogrammierung (dann können wir sagen, es istmachine-specific
oderoperating-system-specific
)
Kommen wir zum Beispiel
#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);
}
}
die Ausgabe ist
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.
Nun lassen Sie mich Ihnen sagen, was #pragma
tat…
Es weist das Betriebssystem an, den Codeblock auf 4 Threads auszuführen
dies ist nur eine davon many many applications
man kann mit dem wenig anfangen #pragma
Entschuldigung für die externe Probe OpenMP
#pragma
Direktive überlebt die Vorverarbeitungsphase. nicht wie#include
und#define
.– smWikipedia
28. Februar 2018 um 9:31 Uhr
Mögliches Duplikat von Was bedeutet #pragma einmal in C?
– Benutzer9645477
17. April 2018 um 2:49 Uhr
@smwikipedia meinst du, einige Pragmas überleben? #pragma once ist eine Präprozessordirektive, aber #pragma pack ist eine Compilerdirektive
– Lewis Kelsey
26. März 2020 um 14:00 Uhr