Verwendung von #pragma in C

Lesezeit: 5 Minuten

Was sind einige Verwendungen von #pragma in C, mit Beispielen?

  • #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

Benutzeravatar von Steven A. Lowe
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

Benutzeravatar von SmacL
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

Benutzeravatar von Adam Rosenfield
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

Benutzeravatar von Schildmeijer
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 */)

Benutzeravatar von sandeep
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

Benutzeravatar von Justin Love
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

Benutzeravatar von TWhite
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 ist machine-specific oder operating-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

1423160cookie-checkVerwendung von #pragma in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy