Quelles sont les utilisations de #pragma
en C, avec des exemples ?
Réponses
Trop de publicités?#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.
#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 ;)
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.
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 */
)
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.
- Réponses précédentes
- Plus de réponses