Difference between revisions of "cpp/io/cout"
(reword to mention that <iostream> needs to be included to output in static ctors/dtors) |
m (Reverted edits by $HOME (talk) to last revision by Andreas Krug) |
||
(19 intermediate revisions by 14 users not shown) | |||
Line 2: | Line 2: | ||
{{cpp/io/basic_ostream/navbar}} | {{cpp/io/basic_ostream/navbar}} | ||
{{dcl begin}} | {{dcl begin}} | ||
− | {{dcl header | iostream }} | + | {{dcl header|iostream}} |
− | {{dcl | num=1 | 1= | + | {{dcl|num=1|1= |
extern std::ostream cout; | extern std::ostream cout; | ||
}} | }} | ||
− | {{dcl | num=2| 1= | + | {{dcl|num=2|1= |
extern std::wostream wcout; | extern std::wostream wcout; | ||
}} | }} | ||
{{dcl end}} | {{dcl end}} | ||
− | The global objects {{ | + | The global objects {{tt|std::cout}} and {{tt|std::wcout}} control output to a stream buffer of implementation-defined type (derived from {{lc|std::streambuf}}), associated with the standard C output stream {{lc|stdout}}. |
− | These objects are guaranteed to be initialized during or before the first time an object of type {{lc|std::ios_base::Init}} is constructed and are available for use in the constructors and destructors of static objects (as long as {{ | + | These objects are guaranteed to be initialized during or before the first time an object of type {{lc|std::ios_base::Init}} is constructed and are available for use in the constructors and destructors of static objects with [[cpp/language/initialization#Non-local_variables|ordered initialization]] (as long as {{header|iostream}} is included before the object is defined). |
− | Unless {{c|sync_with_stdio(false)}} has been issued, it is safe to concurrently access these objects from multiple threads for both formatted and unformatted output. | + | Unless {{c|std::ios_base::sync_with_stdio(false)}} has been issued, it is safe to concurrently access these objects from multiple threads for both formatted and unformatted output. |
− | + | By specification of {{lc|std::cin}}, {{c|std::cin.tie()}} returns {{c|&std::cout}}. This means that any input operation on {{tt|std::cin}} executes {{c|std::cout.flush()}} (via {{lc|std::basic_istream::sentry}}'s constructor). Similarly, {{c|std::wcin.tie()}} returns {{c|&std::wcout}}. | |
− | + | By specification of {{lc|std::cerr}}, {{c|std::cerr.tie()}} returns {{c|&std::cout}}. This means that any output operation on {{tt|std::cerr}} executes {{c|std::cout.flush()}} (via {{lc|std::basic_ostream::sentry}}'s constructor). Similarly, {{c|std::wcerr.tie()}} returns {{c|&std::wcout}}. {{mark since c++11}} | |
+ | |||
+ | ===Notes=== | ||
+ | The 'c' in the name refers to "character" ([https://www.stroustrup.com/bs_faq2.html#cout stroustrup.com FAQ]); {{tt|cout}} means "character output" and {{tt|wcout}} means "wide character output". | ||
+ | |||
+ | Because [[cpp/language/initialization#Dynamic_initialization|dynamic initialization]] of [[cpp/language/templates#Templated_entity|templated]] variables are unordered, it is not guaranteed that {{tt|std::cout}} has been initialized to a usable state before the initialization of such variables begins, unless an object of type {{lc|std::ios_base::Init}} has been constructed. | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | |code= | |
#include <iostream> | #include <iostream> | ||
− | struct Foo { | + | |
+ | struct Foo | ||
+ | { | ||
int n; | int n; | ||
− | Foo() { | + | Foo() |
− | + | { | |
+ | std::cout << "static constructor\n"; | ||
} | } | ||
− | ~Foo() { | + | ~Foo() |
− | + | { | |
+ | std::cout << "static destructor\n"; | ||
} | } | ||
}; | }; | ||
+ | |||
Foo f; // static object | Foo f; // static object | ||
+ | |||
int main() | int main() | ||
{ | { | ||
std::cout << "main function\n"; | std::cout << "main function\n"; | ||
} | } | ||
− | + | |output= | |
static constructor | static constructor | ||
main function | main function | ||
Line 47: | Line 58: | ||
===See also=== | ===See also=== | ||
{{dsc begin}} | {{dsc begin}} | ||
− | {{dsc inc | cpp/io/ios_base/dsc Init}} | + | {{dsc inc|cpp/io/ios_base/dsc Init}} |
− | {{dsc inc | cpp/io/dsc clog}} | + | {{dsc inc|cpp/io/dsc cerr}} |
− | {{dsc inc | cpp/io/dsc | + | {{dsc inc|cpp/io/dsc clog}} |
+ | {{dsc inc|cpp/io/c/dsc std streams}} | ||
{{dsc end}} | {{dsc end}} | ||
− | + | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Latest revision as of 18:32, 14 September 2023
Defined in header <iostream>
|
||
extern std::ostream cout; |
(1) | |
extern std::wostream wcout; |
(2) | |
The global objects std::cout
and std::wcout
control output to a stream buffer of implementation-defined type (derived from std::streambuf), associated with the standard C output stream stdout.
These objects are guaranteed to be initialized during or before the first time an object of type std::ios_base::Init is constructed and are available for use in the constructors and destructors of static objects with ordered initialization (as long as <iostream> is included before the object is defined).
Unless std::ios_base::sync_with_stdio(false) has been issued, it is safe to concurrently access these objects from multiple threads for both formatted and unformatted output.
By specification of std::cin, std::cin.tie() returns &std::cout. This means that any input operation on std::cin
executes std::cout.flush() (via std::basic_istream::sentry's constructor). Similarly, std::wcin.tie() returns &std::wcout.
By specification of std::cerr, std::cerr.tie() returns &std::cout. This means that any output operation on std::cerr
executes std::cout.flush() (via std::basic_ostream::sentry's constructor). Similarly, std::wcerr.tie() returns &std::wcout. (since C++11)
[edit] Notes
The 'c' in the name refers to "character" (stroustrup.com FAQ); cout
means "character output" and wcout
means "wide character output".
Because dynamic initialization of templated variables are unordered, it is not guaranteed that std::cout
has been initialized to a usable state before the initialization of such variables begins, unless an object of type std::ios_base::Init has been constructed.
[edit] Example
#include <iostream> struct Foo { int n; Foo() { std::cout << "static constructor\n"; } ~Foo() { std::cout << "static destructor\n"; } }; Foo f; // static object int main() { std::cout << "main function\n"; }
Output:
static constructor main function static destructor
[edit] See also
initializes standard stream objects (public member class of std::ios_base )
| |
writes to the standard C error stream stderr, unbuffered (global object) | |
writes to the standard C error stream stderr (global object) | |
expression of type FILE* associated with the input streamexpression of type FILE* associated with the output streamexpression of type FILE* associated with the error output stream (macro constant) |