6 votes

Blocage de la tringlerie de la lunette standard C

Les identifiants suivants n'ont pas de lien : un identifiant déclaré comme étant autre chose qu'un objet ou une fonction ; un identifiant déclaré comme étant un paramètre de fonction ; un identifiant d'étendue de bloc pour un objet déclaré sans le spécificateur de classe de stockage extern .

{
    static int a; //no linkage
}

Pour un identificateur déclaré avec le spécificateur de classe de stockage extern dans une portée dans laquelle une déclaration antérieure de cet identificateur est visible, si la déclaration antérieure spécifie un lien interne ou externe, le lien de l'identificateur lors de la déclaration ultérieure est le même que celui spécifié lors de la déclaration antérieure. Si aucune déclaration antérieure n'est visible, ou si la déclaration préalable n'indique pas d'association , alors l'identifiant a un lien externe .

{
    static int a; //no linkage
    extern int a; //a should get external linkage, no?
}

Erreur GCC : déclaration externe d'une déclaration suivante sans lien avec celle-ci

Quelqu'un peut-il m'expliquer pourquoi j'obtiens cette erreur ?

Merci.

8voto

caf Points 114951

Votre supposition est correcte : la deuxième déclaration de a a un lien avec l'extérieur. Cependant, vous obtenez une erreur parce que votre code viole une contrainte dans §6.7 :

3 Si un identificateur n'a pas de lien, il ne doit pas y avoir plus d'une déclaration de l'identificateur (dans une déclaration). déclaration de l'identificateur (dans un déclarateur ou un spécificateur de type) avec la même portée et dans le même espace de nom, sauf pour les balises comme comme indiqué à l'article 6.7.2.3.

C'est-à-dire qu'une fois que vous avez déclaré a pour ne pas avoir de lien, vous ne pouvez pas le redéclarer à nouveau dans la même portée.


Voici un exemple valable d'application de cette règle :

int a = 10;  /* External linkage */

void foo(void)
{
    int a = 5;  /* No linkage */

    printf("%d\n", a);    /* Prints 5 */

    {
        extern int a;  /* External linkage */

        printf("%d\n", a);    /* Prints 10 */
    }
}

2voto

glglgl Points 35668

si la déclaration préalable n'indique pas d'association

signifie

si la déclaration préalable précise ne pas être un signe de liaison

et non

si la déclaration préalable précise qu'il n'a pas de liaison

C'est confus et ambigu ; ce n'est pas la façon habituelle de rédiger une norme...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X