Одновременное создание внутренних и внешних связей в C

Я читал ссылку C о привязке (внешней, внутренней и никакой) и наткнулся на следующее:

Если в единице перевода один и тот же идентификатор появляется как с внутренней, так и с внешней связью, поведение не определено.

Я хотел знать, как может произойти это неопределенное поведение. Исходя из того, что я прочитал, переменная может иметь только один класс хранения. Таким образом, он не может быть объявлен как static, так и extern одновременно.

Итак, в каком сценарии переменная может иметь как внутреннюю, так и внешнюю связь?


person Abhay Aravinda    schedule 05.09.2020    source источник
comment
Ну, вы можете объявить одну и ту же функцию несколько раз; и у вас есть определение против декларации. Может быть, это намерение? Просто предположение, IANALL.   -  person einpoklum    schedule 05.09.2020


Ответы (1)


В этом коде:

extern int x;
static int x;

Первое объявление говорит, что x имеет внешнюю связь, а второе объявление говорит, что у него есть внутренняя связь.

person Eric Postpischil    schedule 06.09.2020
comment
Просто хотел уточнить. Он не скомпилируется, если я помещу extern int x и static int x в одну и ту же область. Он компилируется, если я объявляю статическую глобальную переменную и использую ключевое слово extern внутри main(). Это то, что вы имели в виду? - person Abhay Aravinda; 06.09.2020
comment
Извиняюсь. Он компилируется, если я сначала объявлю его статическим, а затем внешним (оба объявлены в глобальной области видимости). Спасибо за ответ - person Abhay Aravinda; 06.09.2020
comment
@AbhayAravinda: extern и static имеют разные эффекты в зависимости от того, где они появляются. Если идентификатор объявлен extern после более раннего объявления с внутренней или внешней связью, новое объявление просто копирует старое; он не изменит объявление с внутренней связью на внешнюю. (Если в предыдущем объявлении не указано никакой связи, новое объявление создает новый идентификатор с внешней связью.) Если идентификатор объявлен с static в области блока, он не имеет связи. - person Eric Postpischil; 06.09.2020
comment
Таким образом, extern int x; static int x; дает x две связи, нарушая правила, поскольку первое объявление имеет внешнюю связь. Но static int x; extern int x; правил не нарушает, так как второе объявление оставляет внутреннюю компоновку. - person Eric Postpischil; 06.09.2020