2010-03-01 6 views
5

Est-il juste de tester un programme simple, avec ce fichier d'en-tête # inclus? Pour mieux comprendre le processus de compilation, j'écris mon propre "configure", qui teste l'existence de quelques fichiers d'en-tête et de bibliothèque.La meilleure façon de vérifier par programme l'existence du fichier d'en-tête?

+0

Vous avez le nom de fichier et la liste des répertoires inclus. Pourquoi ne pas simplement vérifier si le fichier est dans l'un d'entre eux? –

+1

@Nikolai: une raison pour ne pas le faire est que l'en-tête 'headline' peut inclure d'autres fichiers, et il est plus difficile de vérifier si les fichiers dont il dépend sont présents en vérifiant s'ils sont tous présents essayez la compilation. –

+0

@Jonathan: Je comprends cela. Bien sûr, cela dépend totalement de la portée du projet, mais je ferais une recherche récursive pour les directives 'include'. –

Répondre

6

Oui, utilisez le compilateur pour compiler votre programme de test simple. C'est la meilleure et la plus simple façon de voir si le compilateur peut trouver l'en-tête. Si vous codez #include chemins de recherche, vous devrez toujours modifier et adapter pour différents compilateurs.

+0

D'accord; Comme le note Jonathan Leffler, c'est ainsi que le fait Autoconf, qui est au moins un vote d'expérience raisonnablement fort en sa faveur. –

4

La suite GNU Autoconf vérifie les en-têtes en exécutant des compilations de test. Juste pour tester l'existence d'un fichier « filename.h » est assez simple:

#include <filename.h> 
int main(void){return 0;} 

Vous préférez peut-être guillemets au lieu de crochets. Avec le programme suivant, vous pouvez trouver l'existence du fichier d'en-tête.

-1

#include<stdio.h> 
main() 
{ 
     FILE * file; 
     if ((file = fopen("/usr/include/stdio.h", "r"))!=NULL) 
     { 
       fclose(file); 
       printf("true"); 
     } 
     perror("err"); 

} 
+1

Critique? Nom fixe pour le fichier que vous recherchez. Emplacement fixe pour le fichier que vous recherchez. En utilisant le fichier que vous recherchez lors de la compilation du programme que vous utilisez pour le rechercher. Impression de l'état sur stdout lorsque OK et sur stderr dans le cas contraire. Ne pas retourner différents statuts de sortie pour le succès et l'échec. En utilisant archaïque C définition de main - C99 nécessite 'int main()' ou 'int main (void)', donc ce doit être le code C89 ou plus ancien. Malheureusement, seul C99 garantit un statut de sortie nul de main() lorsque vous ne mettez pas de retour explicite, donc le statut de sortie est indéfini. –

+0

Cela ne fonctionnera pas du tout en général. –

Questions connexes