2017-02-23 1 views
-2

m'a donné un grand fichier C contenant plusieurs fonctions déclarées comme suit:C - fonction vide (vide), les paramètres et le retour des valeurs

void function_a(void); 

Les fonctions sont écrites dessus du programme principal:

static void function_a(void) { .... } 

Dans le programme principal de ces fonctions sont appelées:

function_a(); 

maintenant, pour autant que je connais un foncti sur déclaré comme écrit ci-dessus n'utilise ni paramètres, ni ont des valeurs de retour. Cependant, au sein de ces fonctions, on utilise des variables et des tableaux, qui ne sont pas définis dans ces fonctions, mais uniquement dans le programme principal.

Est-ce vraiment correct C-Syntax? Comment les fonctions peuvent-elles accéder aux données du programme principal, si elles ne sont pas transmises en tant que paramètre?

En outre, le programme principal utilise des variables qui sont calculées dans les fonctions qu'il appelle.

+3

Sont-ils définis dans la * fonction * principale, ou dans le * fichier *? – StoryTeller

+0

Désolé, je viens d'éditer. Ils sont définis dans le fichier au-dessus de la fonction principale –

+3

Veuillez poster un exemple complet au lieu de fragments. – Lundin

Répondre

5

Pouvez-vous fournir plus de contexte, s'il vous plaît? En C, vous ne pouvez pas accéder aux variables d'une autre fonction, mais vous pouvez accéder aux variables globales.

Le programme suivant est valide et sortira 3, puisque i est une variable globale et est visible partout. le programme ci-dessous

#include <stdio.h> 

int i = 2; 

void plusone() { 
     i = i + 1; 
} 

int main() { 
     plusone(); 
     printf("i = %d\n", i); 
} 

De l'autre côté, ne compilera pas parce que i est fonction locale à main() et est invisible ailleurs.

#include <stdio.h> 

void plusone() { 
     i = i + 1; 
} 

int main() { 
     int i = 2; 
     plusone(); 
     printf("i = %d\n", i); 
} 

dit, l'utilisation des variables globales est une mauvaise pratique et devrait être évitée.

+0

Okay. Que faire si j'ai un autre fichier C contenant uniquement des définitions de variables et que ce fichier est lié à mon fichier C contenant le programme principal et les autres fonctions. Les variables du fichier C séparé sont elles aussi globales? –

+3

@ J.M. vous devriez déclarer ces variables comme 'extern' afin que vous puissiez les utiliser. –

0

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.

0

En C, il n'est pas du tout possible d'accéder aux variables locales d'une autre fonction ou même d'une étendue. Le code est-il compilé correctement? Si oui, ces variables doivent être définies globalement au début ou dans un fichier d'en-tête. Si ce n'est pas le rendre global pour accéder à partir de fonctions non paramétriques.

+0

une autre fonction a une autre portée donc votre première phrase est un peu redondante. –

+1

Bien sûr, vous pouvez accéder aux variables de votre portée parent. – unwind