Как реализованы объекты iostream cin, cout, cerr и clog? - PullRequest
1 голос
/ 23 сентября 2010

Объекты iostream cin, cout, cerr и clog являются объектами, объявленными в заголовке iostream.

Мне известно, что в некоторых компиляторах возможно попытаться использовать эти объекты iostream до того, как они будут созданы, поэтому при некоторых обстоятельствах они должны подвергаться "фиаско статического порядка инициализации". В тех компиляторах, где всегда безопасно использовать std :: cout и др., Как эти объекты на самом деле создаются? Включает ли это магию компилятора под капотом или все это в принципе может быть сделано со стандартным C ++?

std :: cout и т. Д. Кажутся либо глобальными переменными, либо синглтоном: почему глобальные переменные и синглтоны обычно считаются злом, но, по-видимому, не в этом конкретном случае?

1 Ответ

5 голосов
/ 23 сентября 2010

Там нет магии компилятора.

IIRC, стандартная реализация заключается в определении объекта глобальной константы в заголовке.В каждую единицу перевода включен этот заголовок, создается один такой объект.Его конструктор увеличивает счетчик, а деструктор уменьшает его.При увеличении от 0 до 1 создаются объекты потока консоли, при уменьшении с 1 до 0 они уничтожаются.

...