125 votes

Utilisation de #pragma en C

Quelles sont les utilisations de #pragma en C, avec des exemples ?

74voto

Steven A. Lowe Points 40596

#pragma est destiné aux directives du compilateur qui sont spécifiques à la machine ou au système d'exploitation, c'est-à-dire qu'il indique au compilateur de faire quelque chose, de définir une option, d'effectuer une action, de remplacer une valeur par défaut, etc. qui peut ou non s'appliquer à toutes les machines et à tous les systèmes d'exploitation.

Ver msdn pour plus d'informations.

58voto

Shane MacLaughlin Points 12765

#pragma est utilisé pour faire quelque chose de spécifique à l'implémentation en C, c'est-à-dire être pragmatique pour le contexte actuel plutôt qu'idéologiquement dogmatique.

Celui que j'utilise régulièrement est #pragma pack(1) où j'essaie de tirer le meilleur parti de mon espace mémoire sur des solutions intégrées, avec des tableaux de structures qui, autrement, se retrouveraient avec un alignement sur 8 octets.

Dommage que nous n'ayons pas un #dogma encore. Ce serait amusant ;)

38voto

Adam Rosenfield Points 176408

J'essaierais généralement d'éviter l'utilisation de #pragmas si possible, car ils sont extrêmement dépendants du compilateur et non portables. Si vous voulez les utiliser de manière portable, vous devrez entourer chaque pragme d'un mot-clé de type #if / #endif paire. GCC décourage l'utilisation des pragmas, et ne supporte réellement que certains d'entre eux pour la compatibilité avec d'autres compilateurs ; GCC a d'autres moyens de faire les mêmes choses que les autres compilateurs utilisent pour les pragmas.

Par exemple, voici comment vous pouvez vous assurer qu'une structure est compacte (c'est-à-dire qu'il n'y a pas de remplissage entre les membres) dans MSVC :

#pragma pack(push, 1)
struct PackedStructure
{
  char a;
  int b;
  short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7

Voici comment vous feriez la même chose en GCC :

struct PackedStructure __attribute__((__packed__))
{
  char a;
  int b;
  short c;
};
// sizeof(PackedStructure == 7)

Le code GCC est plus portable, parce que si vous voulez le compiler avec un compilateur non-GCC, tout ce que vous avez à faire est de

#define __attribute__(x)

Alors que si vous voulez porter le code MSVC, vous devez entourer chaque pragma d'une balise #if / #endif paire. Pas joli.

17voto

Schildmeijer Points 10975

Mettez #pragma once en haut de votre fichier d'en-tête garantira qu'il ne sera inclus qu'une seule fois. Notez que #pragma once n'est pas un standard C99, mais est supporté par la plupart des compilateurs modernes.

Une alternative est d'utiliser des gardes d'inclusion (par exemple #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */ )

7voto

sandeep Points 61

Ce que je ressens est #pragma est une directive qui permet de spécifier l'emplacement du code, par exemple si vous voulez que le compteur du programme soit lu à partir de l'adresse spécifique où l'ISR est écrit, vous pouvez spécifier l'ISR à cet emplacement en utilisant la directive #pragma vector=ADC12_VECTOR et suivi d'une interruption du nom des rotines et de sa description.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X