在进入main函数之前,你能用C++打印任何东西吗?

use*_*897 8 c++

在进入main函数之前,你能用C++打印任何东西吗?

这是布隆伯格的采访问题:

答案 :创建一个全局变量,从printf语句中为某些内容分配值.

Arm*_*yan 9

#include <iostream>
struct X
{
   X() 
   {
       std::cout << "Hello before ";
   }
} x;

int main()
{
   std::cout << "main()";
}
Run Code Online (Sandbox Code Playgroud)

这个格式良好的C++程序打印

你好main()之前

你看,C++标准保证了命名空间范围变量的构造函数(在这个例子中,它是x)将在之前执行main().因此,如果您在此类对象的构造函数中打印某些内容,则会在之前打印它main().QED

  • 答案遗漏了一件:你怎么能确定std :: cout在这一点上是安全的? (3认同)
  • @wilhelmtell我认为你误解了引用,这意味着标准*保证*`cout`**将在`x`之前构建.在单个翻译单元中构造静态持续时间的对象的顺序保证是从上到下,这意味着`ios_base :: Init`对象将在*`x之前构造* (3认同)
  • 在n3242草案中的27.4.1/2,我没有c ++ 03或n3290可用:*构造对象并在第一次使用类ios_base ::的对象之前或期间建立关联构造初始化,并且在主体开始执行之前的任何情况下.程序执行期间不会销毁对象.在翻译单元中包含<iostream>的结果应该好像<iostream>定义了具有静态存储持续时间的ios_base :: Init的实例.[...]* (2认同)
  • @wilhelmtell我的意思是在答案的代码中,是的,只有在包含`iostream`后才定义`x`*,这就是这里的情况,也是在Kerrek的答案中. (2认同)

Ker*_* SB 8

#include <iostream>

std::ostream & o = (std::cout << "Hello\n");

int main()
{
   o << "Now main() runs.\n";
}
Run Code Online (Sandbox Code Playgroud)

  • @wilhelmtell:你基本上是这样说"如果I/O失败,你需要在`main()`之前执行I/O,那么你就有问题." 我同意. (2认同)