Подскажите, как ведет себя extern в следующей ситуации:
extern int a,
b,
c;
Все три переменные a, b и c являются внешними, так ведь?
Да, все 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
В синтаксисе объявления спецификатор класса хранения extern входит в "общую" часть объявления (declaration-specifiers в С, decl-specifier-seq в С++), то есть относится ко всем деклараторам в объявлении, а не к какому-то одному. В вашем примере все три переменные объявлены с внешним связыванием.
Отдельный вопрос - что вы имеете в виду под "являются внешними". Спецификатор extern просто придает идентификатору внешнее связывание. Но он совсем не говорит, что данная переменная определена где-то в другом месте.
Например, объявление
extern int a,
b = 42,
c;
говорит о том, что переменные a и c имеют внешнее связывание и определены где-то в другом месте, а вот переменная b имеет внешнее связывание и определена здесь (и доступна из других мест).
Другими словами, спецификатор extern может иметь как семантику "импорта", так и семантику "экспорта", в зависимости от того, является ли объявление переменной или функции еще и определением.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей