c extern при множественном объявлении

32
20 ноября 2018, 12:40

Подскажите, как ведет себя extern в следующей ситуации:

extern int a,
           b,
           c;

Все три переменные a, b и c являются внешними, так ведь?

Answer 1

Да, все 3 являются внешними.

Кстати, чтобы это проверить, достаточно их объявить и использовать с наблюдаемым поведением (это важно!). В таком случае линкер сообщит о попытках использовать несуществующие переменные: https://ideone.com/rgf40P

extern int a, b, c;
int main()
{
  return a + b + c;
}
/home/CPCz1j/ccrst43X.o: In function `main':
prog.cpp:(.text.startup+0x2): undefined reference to `b'
prog.cpp:(.text.startup+0x8): undefined reference to `a'
prog.cpp:(.text.startup+0xe): undefined reference to `c'
collect2: error: ld returned 1 exit status
Answer 2

В синтаксисе объявления спецификатор класса хранения extern входит в "общую" часть объявления (declaration-specifiers в С, decl-specifier-seq в С++), то есть относится ко всем деклараторам в объявлении, а не к какому-то одному. В вашем примере все три переменные объявлены с внешним связыванием.

Отдельный вопрос - что вы имеете в виду под "являются внешними". Спецификатор extern просто придает идентификатору внешнее связывание. Но он совсем не говорит, что данная переменная определена где-то в другом месте.

Например, объявление

extern int a,
           b = 42,
           c;

говорит о том, что переменные a и c имеют внешнее связывание и определены где-то в другом месте, а вот переменная b имеет внешнее связывание и определена здесь (и доступна из других мест).

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

READ ALSO
Как с нуля поставить cucumber фреймворк?

Как с нуля поставить cucumber фреймворк?

Я начинающий автоматизатор, и мне очень понравился фреймворк cucumber, и хочется самому поставить его у себя дома на ПКМогу писать сценарии и степы...

24
Как изменить панель в зависимости от выбора?

Как изменить панель в зависимости от выбора?

мне нужно сделать что-то типа TreeView, суть в том, что-бы когда пользователь выбирает некий класс менялась основная панель, реализовать всё нужно...

32
Сохранение видеопотока

Сохранение видеопотока

Есть задача - реализовать 2 сервиса, один отдает видеопоток, другой принимает его и записывает на дискВопрос в том, как осуществить соединение...

40
Как изменить цвет JButton во время нажатия

Как изменить цвет JButton во время нажатия

Есть какие-то методы позволяющие изменить цвет JButton во время нажатия? Если же нет, то как это возможно сделать? Пытался найти, но ничего достаточно...

19