【问题标题】:Can you print anything in C++, before entering into the main function?在进入主函数之前,你能用 C++ 打印任何东西吗?
【发布时间】:2012-02-25 00:12:30
【问题描述】:

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

这是彭博社的采访问题:

回答 :创建一个全局变量,从 printf 语句中分配一些内容。

【问题讨论】:

  • 您还应该要求他们向您展示a)他们的代码风格指南,以及b)他们代码库中的一段可表示的代码。
  • @KerrekSB:就像在任何大型组织中一样(Bloomberg 有超过 3000 名开发人员),代码质量从差到好不等。关于在输入 main() 之前执行代码的问题并非完全无关紧要,而且是一个合理的介绍,例如讨论如何确保构造访问的对象。每天都重要吗?可能不是。 ...我会怀疑上面引用的答案:全局变量和printf() 的使用都会让我感到疑惑。

标签: c++


【解决方案1】:
#include <iostream>
struct X
{
   X() 
   {
       std::cout << "Hello before ";
   }
} x;

int main()
{
   std::cout << "main()";
}

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

main() 之前你好

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

【讨论】:

  • 答案缺少一块:您如何确定此时 std::cout 可以安全使用?
  • @awoodland 嗯...因为标准保证它? (强硬的说法,我会尽力证明:)
  • n3242 草案中的 27.4.1/2,我没有可用的 c++03 或 n3290:在之前或期间的某个时间构造对象并建立关联第一次构造 ios_base::Init 类的对象,并且无论如何在 main 的主体开始执行之前。对象在程序执行期间不会被破坏。在翻译单元中包含 的结果应如同 定义了一个具有静态存储持续时间的ios_base::Init 实例。 [...]
  • @wilhelmtell 我想你误解了那句话,这意味着标准保证coutx之前构建。在单个翻译单元中构造静态持续时间的对象的顺序保证是从上到下的,这意味着 ios_base::Init 对象将在 before x 之前构造
  • @wilhelmtell 我的意思是在答案中的代码中,是的,只有在包含iostream 之后,xdefined 的,这里就是这种情况,并且也在Kerrek的回答中。
【解决方案2】:
#include <iostream>

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

int main()
{
   o << "Now main() runs.\n";
}

【讨论】:

  • 当然,您不希望 o 全局可见:namespace { std::ostream&amp; o(std::cout &lt;&lt; "hello\n"); }static std::ostream&amp; o(std::cout &lt;&lt; "hello\n"); 但这些都是细节。
  • 如果operator&lt;&lt;() 抛出你有问题。
  • @wilhelmtell:您基本上是在说“如果 I/O 失败并且您需要在 main() 之前执行 I/O,那么您就有问题了。”我同意。
  • @wilhelmtell 还请注意,默认情况下 iostreams 不会抛出。
【解决方案3】:

头文件

class A
{
   static A* a;
public:
   A() { cout << "A" ; }
};

实施文件:

A* A::a = new A;

好吧,在调用 main 之前,静态(并且不仅仅是)被初始化。

编辑

另一个:

bool b = /*(bool)*/printf("before main");

int main()
{
   return 0;
}

【讨论】:

  • @wilhelmtell 有什么问题? A 不能包含自己作为成员,我懒得写另一个类来证明一点。
【解决方案4】:
#include <iostream>
using namespace std;

int b() {
  cout << "before ";
  return 0;
}
static int a = b();

int main() {
  cout << "main\n";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2016-12-11
    • 2018-12-03
    相关资源
    最近更新 更多