当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《函数内部的C++变量声明未被调用会改变正常的应用程序流程》经验,为你挑选了1个好方法。

我正在尝试使用Pleora SDK创建一个从热像仪加载图像的应用程序.所以我的第一次尝试是在网络中找到可用的设备,但是我在C++中遇到了一个奇怪的行为我真的没有合理的解释:代码流跳转到其他一些而不是" PvSystem lSystem " 声明的主要功能即使没有被召唤.

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

#include 

#include 
#include 
#include 

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 

#include 
#include 
#include 

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


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

    return 0;
}

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

Application start

我真的不知道发生了什么.有人能帮我理解吗?



1> A.S.H..:

全局变量的初始化在main启动之前被调用.

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

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

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

另一种可能性是,就像在@SamVarshavchik的评论中一样,你在代码中拥有一些在main之前调用的构造函数(对于全局对象),并且这些构造函数中的错误引发了一个未定义的行为.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有