5 votes

Limite de profondeur d'inclusion de l'en-tête

Je me demandais, quand on inclut des fichiers d'en-tête, est-ce que la profondeur des fichiers inclus peut augmenter sans limite? Peut-on spécifier une limite au moment de la compilation?

Exemple:

main.c:

#include "A.h"
const int xyz = CONST_VALUE;

A.h:

#include "B.h"

B.h:

#include "C.h"

...

...

...

Z.h:

#define CONST_VALUE ( 12345 )

Suis-je correct? Les fichiers d'en-tête peuvent-ils être inclus indéfiniment?

4voto

dbush Points 8590

Il existe une limite qui diffère en fonction du compilateur.

Dans la section 6.10.2 du [standard C] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) :

6 Une directive de prétraitement #include peut apparaître dans un fichier source qui a été lu en raison d'une directive #include dans un autre fichier, jusqu'à une limite d'imbrication définie par l'implémentation (voir 5.2.4.1).

Section 5.2.4.1:

L'implémentation doit être capable de traduire et d'exécuter au moins un programme qui contient au moins une instance de chacune des limites suivantes :

...

  • 15 niveaux d'imbrication pour les fichiers #include

Donc, le standard indique que les implémentations conformes doivent prendre en charge au moins une profondeur de 15 niveaux, mais peut-être plus.

En pratique, vous ne atteindrez probablement pas une telle limite à moins d'avoir une boucle dans vos fichiers inclus.

Par exemple, si vous faites ceci :

main.h :

#include "main.h"

extern int x;

main.c :

#include 
#include "main.h"

int x = 2;

int main()
{
    printf("x=%d\n",x);
    return 0;
}

gcc vous donnera l'erreur suivante :

erreur : #include imbriqué trop profondément

Dans mon cas (gcc 4.8.5), il est allé jusqu'à environ 200 niveaux de profondeur avant de générer une erreur. Voir le manuel du préprocesseur gcc, section 11.2 pour plus de détails.

Pour MSVC, il supporte une profondeur d'inclusion de 10 (voir ici). Notez que cela signifie (entre autres raisons) que MSVC n'est pas un compilateur conforme aux normes.

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