donc ceci:
//file_a.c
void function_a(void)
{
//...
}
Makes function_a
une fonction ne prend aucun argument et ne renvoie aucune valeur. Cette fonction peut être utilisée par toutes les autres fonctions du même fichier function_a
déclaré ou dans tout autre fichier .c
que vous demandez au compilateur de rassembler dans le programme final. En d'autres termes, cette fonction est accessible à toutes les unités de traduction de votre programme. Si vous avez cette fonction dans un fichier appelé file_a.c
, et vous avez également un autre fichier nommé file_z.c
vous pouvez le faire:
//file_z.c
void function_z(void)
{
function_a();
}
Et tout va bien.
D'autre part, cette
//file_b.c
static void function_b(void)
{
//...
}
(et je renomme la fonction pour plus de clarté)
Makes function_b
une fonction qui ne prend aucun argument et ne renvoie aucune valeur, tout comme function_a
. Cependant, il indique également que function_b
a une portée de fichier statique dans l'unité de traduction qui commence ou inclut file_b.c
.Cela signifie que les autres unités de traduction ne peuvent pas y accéder.
Donc, si vous maintenant essayé de le faire dans file_z.c
:
void function_z(void)
{
function_b();
}
vous obtiendrez des erreurs de compilation:
file_z.c:(.text+0xa): undefined reference to `function_b'
collect2: error: ld returned 1 exit status
Parce que chaque file_{a,b,z}.c
est (ou devrait probablement) le point de départ de leur propres unités de traduction distinctes, et function_b
a été déclaré avec l'étendue de fichier statique dans file_b.c
, cette fonction simplement "n'existe pas" pour les autres unités de traduction.
Maintenant, pour les variables déclarées juste avant function_b
, je prends un peu qu'ils regardent comme ceci:
//file_a.c
int array[10];
void function_a(void)
{
//...
}
qui déclare simplement une variable globale. Il peut être consulté par toutes les fonctions dans file_a.c
, à condition qu'ils apparaissent après la déclaration. Il peut également être utilisé par d'autres unités de traduction (comme file_b.c
ou file_z.c
) si vous déclarez comme ceci:
//file_b.c
extern int array[10];
Lorsque vous compilez tout togheter, cette déclaration dans l'unité de traduction qui commence par file_b.c
va dire au compilateur que array
n'est pas une variable de portée de fichier dans cette file_b.c
; le compilateur devra plutôt chercher cette variable dans une autre unité de traduction, puis les lier ensemble pour que toutes les fonctions fassent la même chose avec ce bloc de 10 entiers.
Sont-ils définis dans la * fonction * principale, ou dans le * fichier *? – StoryTeller
Désolé, je viens d'éditer. Ils sont définis dans le fichier au-dessus de la fonction principale –
Veuillez poster un exemple complet au lieu de fragments. – Lundin