82 votes

Pourquoi #pragma once n'est-il pas automatiquement assumé ?

Quel est l'intérêt de dire spécifiquement au compilateur d'inclure le fichier une seule fois ? Cela ne serait-il pas logique par défaut ? Y a-t-il même une raison d'inclure un seul fichier plusieurs fois ? Pourquoi ne pas simplement le supposer ? S'agit-il d'un matériel spécifique ?

24 votes

Y a-t-il une raison d'inclure un seul fichier plusieurs fois ? \=> Cela pourrait être le cas. Un fichier peut avoir une compilation conditionnelle #ifdefs en elle. On peut donc dire #define MODE_ONE 1 et ensuite #include "has-modes.h" et ensuite #undef MODE_ONE con #define MODE_TWO 1 y #include "has-modes.h" encore. Le préprocesseur est agnostique par rapport à ce genre de choses, et parfois elles peuvent avoir un sens.

66 votes

Il serait logique qu'il s'agisse de la valeur par défaut. Mais pas celui qu'ils ont choisi lorsque les programmeurs C montaient encore à cheval, portaient des armes et avaient 16 Ko de mémoire.

1 votes

@FrançoisAndrieux mais le duplicata semble demander la même chose sur les gardes d'inclusion en général pas seulement #pragma une fois.

8voto

Graham Points 461

Dans le micrologiciel du produit sur lequel je travaille principalement, nous devons être en mesure de spécifier où les fonctions et les variables globales/statiques doivent être allouées en mémoire. Le traitement en temps réel doit vivre dans la mémoire L1 de la puce pour que le processeur puisse y accéder directement et rapidement. Les traitements moins importants peuvent être placés dans la mémoire L2 de la puce. Et tout ce qui n'a pas besoin d'être traité particulièrement rapidement peut vivre dans la DDR externe et passer par la mise en cache, parce que cela n'a pas d'importance si c'est un peu plus lent.

Le #pragma pour allouer où les choses vont est une longue ligne non triviale. Il serait facile de se tromper. L'effet d'une erreur serait que le code/données serait silencieusement placé dans la mémoire par défaut (DDR), et l'effet d'une erreur d'allocation serait que le code/données serait placé dans la mémoire par défaut (DDR). que peut être un contrôle en boucle fermée qui arrête de fonctionner sans raison, c'est facile à voir.

J'utilise donc des fichiers include, qui ne contiennent que ce pragma. Mon code ressemble maintenant à ceci.

Fichier d'en-tête...

#ifndef HEADERFILE_H
#define HEADERFILE_H

#include "set_fast_storage.h"

/* Declare variables */

#include "set_slow_storage.h"

/* Declare functions for initialisation on startup */

#include "set_fast_storage.h"

/* Declare functions for real-time processing */

#include "set_storage_default.h"

#endif

Et la source...

#include "headerfile.h"

#include "set_fast_storage.h"

/* Define variables */

#include "set_slow_storage.h"

/* Define functions for initialisation on startup */

#include "set_fast_storage.h"

/* Define functions for real-time processing */

Vous remarquerez de multiples inclusions du même fichier, même juste dans l'en-tête. Si je fais une erreur de frappe maintenant, le compilateur me dira qu'il ne peut pas trouver le fichier include "set_fat_storage.h" et je pourrai facilement le corriger.

Donc, pour répondre à votre question, il s'agit d'un exemple réel et pratique de cas où l'inclusion multiple est nécessaire.

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