C++ 在C++;在编译后还有一个可用的应用程序吗?

C++ 在C++;在编译后还有一个可用的应用程序吗?,c++,C++,在一次采访中,我遇到了这样一个问题: 您的朋友给了您一个单一的源代码文件,用于打印 控制台上的斐波那契数。请注意,main()块是 空,并且里面没有任何语句 解释这是如何实现的(提示:全局实例!) 我真的很想知道,这样的事情怎么可能发生 全局/静态变量初始化期间可能会发生问题。代码将在应用程序启动时触发。是,这是可能的。 您需要声明一个对象的全局实例,用于计算对象构造函数中的斐波那契数。文件范围对象的所有[*]构造函数在到达main之前都会被调用,非对象文件范围变量的所有初始值设定项表达式也是如

在一次采访中,我遇到了这样一个问题:

您的朋友给了您一个单一的源代码文件,用于打印 控制台上的斐波那契数。请注意,main()块是 空,并且里面没有任何语句

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


我真的很想知道,这样的事情怎么可能发生

全局/静态变量初始化期间可能会发生问题。代码将在应用程序启动时触发。

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

文件范围对象的所有[*]构造函数在到达
main
之前都会被调用,非对象文件范围变量的所有初始值设定项表达式也是如此

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

[*]注意,“all”忽略了动态加载和卸载程序未直接链接的库的行为。但是,那些技术在基础C++语言之外。p> 希望这有帮助

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

int main()
{
}

因此,一旦声明了类的全局变量,就会调用构造函数,并在那里添加逻辑以打印出斐波那契级数。

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

在此代码中,全局变量
ignore
必须在进入
main()
函数之前初始化。现在,为了初始化全局函数,
print\u fibs()
需要在您可以执行任何操作的地方执行—在本例中,计算并打印斐波那契数!我在下面的问题(我很久以前问过这个问题)中也展示了类似的情况:


请注意,此类代码不安全,通常最好避免使用。例如,当执行
print_fibs()
时,
std::cout
对象可能没有初始化,如果是这样,那么
std::cout
在函数中做什么?但是,如果在其他情况下,它不依赖于这样的初始化顺序,那么调用初始化函数是安全的(这在C和C++中是一种常见的做法)。

我知道一些类似于您所讲的示例。获得它的一种方法是使用模板元编程。使用它,您可以将一些计算进程移动到编译中

你可以用斐波那契数做个例子

如果在静态类构造函数中使用它,则无需在主函数中编写任何代码即可编写数字


希望它能帮助你。

看看提示!因为它是1)我没听说过的东西,2)是有用的琐事,因为人们在采访中会问它,3)这是一个有趣的语言应用,我可以知道4)如果我看到任何人在生产代码中实际使用它,我可以识别它并用生锈的刀刺任何人的脸。一个能干的,专业的C++程序员会知道这个问题的答案。如果面试的目的是确定被采访的人是否是一个称职的专业C++程序员,那么问题不应该给他们答案。另一种方法是在代码中的任何函数中包含逻辑,并使用
assert
#pragma message
等记录输出。这将在编译期间将输出重定向到控制台。这个程序可能永远不会完全编译,但这确实是一种有趣的方式,可以在面试中展示你的“开箱即用”思维。这满足了引用的问题,因为它没有提到任何关于生成二进制的内容;相反,它只是讨论一个可以在控制台上显示“东西”的C文件这是一次采访吗?:-)好的,我承认我经常这样做是为了初始化我的工厂或者执行一些测试代码。顺便说一句,“单一源代码文件”也是一个提示,即条目pint(默认情况下为main)没有被链接器替换。全部?即使是在DLL中的那些在代码>主< /代码>之后被明确加载的,那么,C++没有在技术上定义动态加载的库,所以在纯C++中,我的语句是正确的。因此,将其着色“所有,除了到达main后加载的DLL/DSO中包含的初始值设定项和文件作用域对象。”在这种情况下,
main
为空,因此这些DLL/DSO必须由析构函数加载,这是非常反常的。但是,这是计算机科学,我想我们应该小心使用像“all”这样的词。我在上面的回答中添加了一个关于“all”的警告,还添加了一个关于dtor的注释。是的,但希望它会出现。C++11之前的版本包含一些黄鼠狼式的措辞,意在允许DLL,但实际上这只意味着技术上并不总是有保证,即使在所有实际实现中都有保证,而且很多代码都依赖于它。C++11至少解决了这个问题。您需要声明一个对象的全局实例,该对象的初始值设定项计算斐波那契数。@Nawaz可能值得引用确切的保证。翻译单元中的对象保证按顺序初始化。标准流对象保证在
std::ios_base::Init
对象首次初始化之前或期间初始化。而且
的行为保证“就像”它在命名空间范围中包含
std::ios_base_Init
对象的实例。@Steve314:它不返回任何东西,这就是我使用逗号运算符的原因,以确保整个表达式
(print_fibs(),0)
的类型是
int
。下面是@Nawaz,void函数和逗号运算符的替代方法是返回一个
bool
,变量
bool-fibstrinted
 void print_fibs() 
 {
       //implementation
 }

 int ignore = (print_fibs(), 0);

 int main() {}