Блок связи объема стандарта C - PullRequest
6 голосов
/ 30 августа 2011

Следующие идентификаторы не имеют связи: идентификатор, объявленный как что-либо, кроме объекта или функции;идентификатор, объявленный как параметр функции; идентификатор области блока для объекта, объявленного без спецификатора класса хранения extern .

{
    static int a; //no linkage
}

Для идентификатора, объявленного с помощью спецификатора класса хранения extern вобласть видимости, в которой видна предыдущая декларация этого идентификатора, если в предыдущей декларации указана внутренняя или внешняя связь, связь идентификатора в более поздней декларации такая же, как и связь, указанная в предыдущей декларации.Если никакого предварительного объявления не видно, или , если в предыдущем объявлении не указана связь , , тогда идентификатор имеет внешнюю связь .

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

Ошибка GCC:внешнее объявление следующего объявления без связи

Может кто-нибудь объяснить мне, почему я получаю эту ошибку?

Спасибо

Ответы [ 2 ]

8 голосов
/ 30 августа 2011

Ваше предположение верно: второе объявление a имеет внешнюю связь. Однако вы получаете ошибку, потому что ваш код нарушает ограничение в §6.7:

3 Если идентификатор не имеет связи, должно быть не более одного объявление идентификатора (в деклараторе или спецификаторе типа) с та же область и в том же пространстве имен, за исключением тегов указано в 6.7.2.3.

То есть после того, как вы объявили a не связанными, вы не сможете повторно объявить его снова в той же области видимости.


Допустимый пример применения этого правила:

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 */
    }
}
2 голосов
/ 30 августа 2011

, если в предыдущем объявлении не указана связь

означает

, если в предыдущем объявлении не указано признака связи

а не

, если в предыдущем объявлении указано, что оно не имеет связи

Это сбивает с толку и неоднозначно;не обычный способ написать стандарт ...

...