std::cout
объект объявлен в файле iostream
заголовка, какКак работает std :: cout?
namespace std _GLIBCXX_VISIBILITY(default)
{
...
extern ostream cout;
...
}
Теперь я опуская префикс std::
.
Итак, насколько я понимаю, cout
является «просто» объектом типа ostream
. Я начал задаваться вопросом, почему материал печатается на экран с cout
, а не с другими объектами ostream
, поэтому я попытался создать объект типа ostream
, но компилятор мне не позволил. На самом деле, ostream
- это просто псевдоним для basic_ostream<char>
, и конструктор по умолчанию для этого типа защищен. Хорошо, подумал я. Но потом я подумал: почему для начала начинается декларация cout
? Почему это не вызывает ошибку компилятора?
Я снова попытался объявить ostream
с ключевым словом extern
, такие как
extern ostream os;
os << "Will you compile?\n";
и на этот раз я получил неопределенную ссылочную ошибку зева. Тогда вопрос просто переходит к следующему: есть ли «определение» cout
где-то еще? Если да, то где?
Я не могу обдумать это. Я знаю, что по производительности и соображениям безопасности стандартный заголовок написан неким «загадочным» способом, который не всегда легко читать, если вы полностью и полностью не овладеете языком (чего я, вероятно, не вижу), но я, Мне нравится понимать этот бит.
Спасибо.
Huh what ?? Где вы на самом деле определили 'os'? –
@ πάνταῥεῖ Нигде, следовательно, ошибка компоновщика, упомянутая в вопросе. – hvd
Ключевое слово 'extern' означает, что указанная переменная определена в другом месте, и компилятору не нужно беспокоиться о том, где до времени связывания. Итак, чтобы ответить «есть ли определение« cout »где-то еще?» Да, должно быть. –