如何在C ++中声明main()内部没有任何东西,编译后还有一个工作的应用程序?

在接受采访时,我遇到了一个这样的问题:

你的朋友已经给你一个单一的源代码文件,在控制台上打印斐波那契数字。 请注意,main()块是空的,它里面没有任何语句。

解释这是如何可能的(提示:全局实例!)

我真的想知道这件事情,甚至可能有这样的事情!

它很可能被实现为(或其变体):

  void print_fibs() { //implementation } int ignore = (print_fibs(), 0); int main() {} 

在这个代码中,全局variablesignore必须在进入main()函数之前被初始化。 现在为了初始化全局, print_fibs()需要在你可以做任何事情的地方执行 – 在这种情况下,计算斐波那契数字并打印它们! 我在下面的问题(我曾经问过很多问题)中展示过类似的东西:

  • main()真的是C ++程序的开始吗?

请注意,这样的代码是不安全的,一般应尽量避免。 例如,当执行print_fibs()时, std::cout对象可能不会被初始化,如果是的话, std::cout会在函数中做什么? 但是,如果在其他情况下,它不依赖于这样的初始化顺序,那么调用初始化函数是安全的(这在C和C ++中是常见的)。

希望这可以帮助

 class cls { public: cls() { // Your code for fibonacci series } } objCls; int main() { } 

因此,只要声明该类的全局variables,就调用该构造函数,然后添加打印斐波那契数列的逻辑。

对的,这是可能的。 您需要声明一个对象的全局实例来计算对象构造函数中的斐波那契数。

我知道你说的一些例子。 一种方法是使用模板元编程。 使用它可以将一些计算过程移动到编译。

在这里你可以得到斐波那契数字的例子

如果你在一个静态类的构造函数中使用它,你可以编写数字而不需要在主函数中写任何代码。

希望它可以帮助你。

在全局/静态variables的初始化过程中可能发生事情。 代码将在应用程序启动时触发。

文件范围对象的所有[*]构造函数在到达main之前被调用,对于非对象文件范围variables的所有初始化expression式也是如此。

编辑:此外,所有文件范围对象的所有[*]析构函数在main退出后按构造的相反顺序调用。 理论上,你可以把你的斐波那契程序放在一个对象的析构函数中。

[*]请注意,'all'忽略了dynamic加载和卸载程序没有直接链接的库的行为。 但是,那些技术上不在基本的C ++语言之中。