Bonjour,
Je suis entrain de coder une application, mais je me r ends compte (non sans désarroi !), que les premières lignes de mes ".c" sont rapidement envahies par des "#include" à tout va.
Que ce soient des inclusions de bibilothèques standard (string, socket, stdio et consorts) à mes modules persos ("configuration.h", "network.h", ...etc), ça devient assez "lourd" (surtout pour la maintenance).
Comment font les grandes applications ? Il y a t il un .h qui fait lui-meme appel à tous les headers nécerssaires à l'appli ?
Est-ce mal de mettre des #include à tout va dans les .h eux-meme ?
# #include <foo.h> /* foo(), bar(), BAZ */
Posté par Krunch (site web personnel) . Évalué à 3.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: #include <foo.h> /* foo(), bar(), BAZ */
Posté par Krunch (site web personnel) . Évalué à 3.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: #include <foo.h> /* foo(), bar(), BAZ */
Posté par lockness . Évalué à 1.
Je vais faire ça compléter d'un script que je mettra dans le répertoire de mon projet pour vérifier que le .h est bel et bien nécessaire (à coup de grep/sed).
Merci pour ces infos.
[^] # Re: #include <foo.h> /* foo(), bar(), BAZ */
Posté par Krunch (site web personnel) . Évalué à 2.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Le script
Posté par lockness . Évalué à 0.
#!/bin/bash
#
# check_headers.sh - Check that the headers are mandatory in your C sources.
#
# Conventions :
# #include <stdlib.h> /* NULL */
# #include <stdio.h> /* fread(), fwrite() */
#
# Then, it will check that functions fread() and fwrite(), and macro NULL
# are indeed used in the current source file.
# Note that functions/macros are separated using a comma.
#
# Author : Jean-Romain "Lockness" PAC <L0ckness@yahoo.fr>
# Date : February, 8th, 2005
# License : GPLv2 (see http://www.gnu.org/copyleft/gpl.html(...) for more details)
#
usage()
{
echo "Usage: $0 FILE"
exit 1
}
if [ $# != 1 ]
then
usage
fi
if [ ! -f "$1" ]
then
echo "$0: unable to open \"$1\""
exit 1
fi
LIST_HEADERS=$(grep "#include[\ ]*[<|\"].*\.h[>|\"].*" "$1")
NB_LINES=$(echo "$LIST_HEADERS" | wc -l)
TOKENS=""
for NUMLINE in `seq $NB_LINES`
do
LINE=$(echo "$LIST_HEADERS" | head -$NUMLINE | tail -1)
LINETOKENS="$LINE"
# Removing left side
LINETOKENS="$(echo "$LINETOKENS" | sed 's/.*\/\*[ ]*//g')"
# Removing right side
LINETOKENS=`echo "$LINETOKENS" | sed 's/[ ]*\*\/.*//g'`
# Removing blank spaces
LINETOKENS=`echo "$LINETOKENS" | sed 's/[ ]*//g'`
# Removing left bracket (not to have pb with arguments after for matching)
LINETOKENS=`echo "$LINETOKENS" | sed 's/(//g'`
# Removing right bracket (not to have pb with arguments after for matching)
LINETOKENS=`echo "$LINETOKENS" | sed 's/)//g'`
NEWTOKENS=$(echo "$LINETOKENS" | tr "," "\n")
TOKENS=$(echo -e "$TOKENS\n$NEWTOKENS")
done
for SEARCHED_TOKEN in `echo "$TOKENS"`
do
NB_EVENTS=$(grep "$SEARCHED_TOKEN" "$1" | wc -l)
# Sure that there is a least one token (this of the include line)
if [ ! $NB_EVENTS -gt 1 ]
then
echo "Token [$SEARCHED_TOKEN] not found in the file."
fi
done
exit 0
Si on teste sur ce fichier :
#include <stdio.h> /* fread(), fwrite() */
#include <stdlib.h> /* NULL */
#include <lib_pas_necessaire.h> /* MACRO_PAS_UTILISEE */
int main(void)
{
int a=5;
int *b = NULL;
fread(bidon);
return (0);
}
On obtient :
lockness@enzo:~/labo/include $ ./check_headers.sh source.c
Token [fwrite] not found in the file.
Token [MACRO_PAS_UTILISEE] not found in the file.
Donc ça marche plutôt bien :)
Si vous voulez améliorer le script (notamment pour dire si un include est complètement inutile (vérifier qu'aucun des tokens n'est présent dans le fichier)), libre à vous !
[^] # En Perl
Posté par Krunch (site web personnel) . Évalué à 2.
http://krunch.servebeer.com/~krunch/vrac/sw/qua/checkheaders.pl(...)
(bon en fait c'est totalement illisible et dans 2h je saurai même plus comment j'ai fait ça)
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
# C'est normal
Posté par Pinaraf . Évalué à 3.
Par convention, tous les include sont proprement rassemblés au tout début des fichiers de code source : ainsi, ça reste très "propre". Et c'est pareil dans tous les langages !
# .h Vs .c
Posté par Matthieu Moy (site web personnel) . Évalué à 4.
Par contre, il faut en mettre assez. Une bonne convention est d'avoir un X.c par X.h dont la première ligne est #include "X.h", ce qui te permet d'être sur que ton X.h est auto-sufisant.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.