gpt4 book ai didi

未调用的函数内的 C++ 变量声明会更改正常的应用程序流程

转载 作者:太空狗 更新时间:2023-10-29 20:21:44 27 4
gpt4 key购买 nike

我正在尝试使用 Pleora SDK 创建应用程序以从热像仪加载图像。所以我的第一个尝试是在网络中找到可用的设备,但是我在 C++ 中遇到了一个奇怪的行为,我真的没有合理的解释:代码流跳转到声明“ 的主函数之外的其他地方PvSystem lSystem”,即使它没有被调用。

为了帮助我解释,这里是代码:

#include <iostream>

#include <PvSystem.h>
#include <PvInterface.h>
#include <PvDevice.h>

int DeviceFinding()
{
PvSystem lSystem;
return 0;
}


int main()
{
std::cout << "Application start" << std::endl;
//DeviceFinding();

return 0;
}

此代码在具有以下构建行的 Ubuntu 16.04 64 位上运行时:

g++ weird.cpp -g3 -o WeirdTest -I/opt/pleora/ebus_sdk/Ubuntu-14.04-x86_64/include -L/opt/pleora/ebus_sdk/Ubuntu-14.04-x86_64/lib -lPvBase -lPvBuffer -lPvStream -lPvDevice -lPvGenICam

输出:

Error: GENICAM_ROOT_V2_4 is not set.

但是,如果我用“PvSystem lSystem”注释该行,

#include <iostream>

#include <PvSystem.h>
#include <PvInterface.h>
#include <PvDevice.h>

int DeviceFinding()
{
// PvSystem lSystem;
return 0;
}


int main()
{
std::cout << "Application start" << std::endl;
//DeviceFinding();

return 0;
}

应用程序打印预期的内容:

Application start

我真的不知道发生了什么。有人可以帮助我理解这一点吗?

最佳答案

全局变量的初始化在 main 开始之前被调用。

我不知道 Pleora SDK,但对该模式的一个可能解释是 PvSystem 之前引用了一些需要构造的全局对象(或通过某个函数初始化的全局变量) main 启动,错误发生在该构造函数中。

当该全局对象或变量未在任何地方引用时(当您注释行 PvSystem lSystem; 时),链接器从链接中删除该全局对象,并且没有调用构造函数或初始化程序。这是因为允许链接器从中删除未引用的全局变量。

另一方面,当您激活该行时,链接器实例化了全局对象(或变量),因为它在 PvSystem 中的某处被引用,并且它在 main 之前调用了它的构造函数(或初始化程序) .该初始化程序在环境中检测到一些错误,因此它退出了应用程序或引发了异常。

另一种可能性是,如@SamVarshavchik 的评论所述,您在自己的代码中有一些构造函数(用于全局对象)在 main 之前调用,并且这些构造函数中的错误引发了未定义的行为。

关于未调用的函数内的 C++ 变量声明会更改正常的应用程序流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41743175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com