-3
votes

2 questions sur les fichiers d'en-tête et les erreurs en C

  1. Si j'ai un fichier d'en-tête dans lequel je déclare et défini une fonction, et j'inclus l'en-tête dans un fichier source, renvoie-t-il une erreur? et si oui lequel? J'ai essayé de le faire et ça a fonctionné mais quand quelqu'un d'autre l'a essayé sur son PC, ce n'est pas le cas. Donc, à quelle étape le problème a-t-il eu lieu? est-ce la partie de pré-traitement ou de liaison?
  2. Si je définis la même fonction deux fois (deux fois dans le fichier source ou une fois dans l'en-tête et une autre dans la source), quel type d'erreur est-ce? J'ai besoin de le savoir pour un examen mais je ne pouvais pas trouver des réponses moi-même

3 commentaires

1) Non, tout ira bien. Mais si vous incluez cet en-tête dans deux fichiers source et essayez de les relier, vous obtiendrez une erreur de liaison. 2) Qu'est-ce que c'est appelé? Je ne sais pas.


@Beta ce n'est pas ok.


"Quand quelqu'un d'autre l'a essayé sur son PC, il n'a pas" manqué beaucoup d'informations. Quel message d'erreur s'est produit?


3 Réponses :


1
votes
  1. Je pense que vous devriez d'abord rassembler des informations sur le sujet de liaison.
  2. Ensuite, vous devriez faire des recherches sur des descriptions de fichier d'en-tête.
  3. Enfin, vous devriez apprendre le comportement indéfini.
  4. Linkage
  5. Linkage 2
  6. Fichier d'en-tête Créez
  7. comportement indéfini / UB

0 commentaires

0
votes

La règle de base - Ne placez aucun code (définitions de fonction) ou définitions de variable dans les fichiers d'en-tête.

Il y a une certaine exception possible (par exemple, des fonctions statiques en ligne).

Fichiers d'en-tête: Fonction DCLariations, type de type de type et définitions d'objet externe.

Fichiers source: Organes de fonctionnement et définitions de données.


2 commentaires

Oui, je suis totalement conscient de cela, je ne le pose que parce qu'ils ne nous posent que les conséquences de faire ce genre de choses, alors si quelque chose n'est pas recommandé ou non acceptable mais qui fonctionnera toujours, j'ai besoin de le savoir.


Essayez-vous .. Inclure le même fichier d'en-tête avec des définitions de fonction et de données dans les deux fichiers C. Liez-les



1
votes

Si j'ai un fichier d'en-tête dans lequel je déclare et défini une fonction, et j'inclus l'en-tête dans un fichier source, renvoie-t-il une erreur? et si oui lequel? J'ai essayé de le faire et ça a fonctionné mais quand quelqu'un d'autre l'a essayé sur son PC, ce n'est pas le cas. Donc, à quelle étape le problème a-t-il eu lieu? est-ce la partie de pré-traitement ou de liaison?

Cela dépend. Si vous n'avez pas d'inclure les gardes autour de la définition de la fonction et que le fichier obtient #include d plus d'une fois dans la même unité de traduction ou si le nom de la fonction définie dans l'en-tête est conflit avec un autre Nom de la variable ou de la fonction définie ailleurs dans la source, puis vous obtiendrez une sorte d'erreur de définition en double ou en conflit. Si rien dans l'en-tête est conflit avec un autre code, vous ne le ferez pas. Sans connaître les détails de votre code ou du code de votre ami, il n'y a vraiment aucun moyen de répondre définitivement.

Réponse courte est "Ne fais pas ça" - Ne mettez pas la fonction ou les définitions variables dans les fichiers d'en-tête. De cette façon, vous évitez ce type de problème complètement.

Si je définis la même fonction deux fois (deux fois dans le fichier source ou une fois dans l'en-tête et une autre dans la source), quel type d'erreur est-ce? J'ai besoin de le savoir pour un examen mais je ne pouvais pas trouver des réponses moi-même

La plupart des compilateurs appellent une erreur "définition duplicate". Il n'y a pas de nom non défini formellement pour cela. Voici le texte pertinent de la définition du langage C:

6.9 Définitions externes
...
contraintes
...
3 Il ne doit y avoir plus d'une définition externe pour chaque identifiant déclaré avec liaison interne dans une unité de traduction. De plus, si un identifiant déclaré avec interne Linkage est utilisé dans une expression (autre que dans la partie de l'opérande d'un taille de ou _ALignOf L'opérateur dont le résultat est une constante entière), il doit y avoir exactement un Définition externe pour l'identifiant dans l'unité de traduction.
...
Semantiques
...
5 un définition externe est une déclaration externe qui est également une définition d'une fonction (autre qu'une définition en ligne) ou un objet. Si un identifiant déclaré avec externe Linkage est utilisé dans une expression (autre que dans le cadre de l'opérande d'un taille de ou _ALignOf L'opérateur dont le résultat est une constante entière), quelque part dans l'ensemble de la programme Il doit y avoir exactement une définition externe pour l'identifiant; Sinon, là ne doit pas être plus d'un. 161)
161) Ainsi, si un identifiant déclaré avec une liaison externe n'est pas utilisé dans une expression, il n'est pas nécessaire de ne pas Définition externe pour cela. CR 2011 Projet en ligne

0 commentaires