【问题标题】:How to make variable values persistent between function calls in c / c++如何使变量值在c / c ++中的函数调用之间持久化
【发布时间】:2015-03-21 22:13:04
【问题描述】:

我有以下情况。 我正在从 IBM Notes 应用程序 (Lotusscript) 调用 DLL 中的函数。

其中一个函数使用类型结构,我们在 64Bit 上遇到问题。 TYPE中的所有值只能传递给函数ByRef,但是我需要传递值ByVal。

所以我决定在函数头中为每个值设置单个参数。到目前为止,一切都很好。我有大约 43 个参数,但 LS 只能处理 31 个 ...

下一个想法是在调用注册新用户的函数之前调用即 INIT_REG_PERSON_INFO(arg1,arg2, ... )。

INIT_REG_PERSON_INFO(arg1,arg2, ... );
INIT_REG_ID_INFO(arg1,arg2, ... );
REGISTER_USER();

在 C 中,我有一个函数(我知道,只有一个参数,但仅用于测试)

    /*====================================================================================*/
    /* FUNCTION: BCC_InitRegPersonInfo                                                    */
    /*====================================================================================*/
    STATUS LNPUBLIC BCC_InitRegPersonInfo(char *FirstName){
        try {
            //extern char *REG_PERSON_INFO_FIRSTNAME;
            memset(&reg_person_info, 0, sizeof (reg_person_info));
            reg_person_info.FirstName = FirstName;

            return NOERROR;

        } catch (...)    {
            LogEventText("* BCC_InitRegPersonInfo::Exception *", NULLHANDLE, NOERROR);
            return 1;
        }
    }

reg_person_info 被声明为全局变量

REG_PERSON_INFO reg_person_info;

稍后,在我的 REGISTER_USER() 中,我尝试从全局变量中访问值

LogEventText("* BCC_RegNewPerson1():reg_person_info.FirstName = %s", NULLHANDLE, NOERROR,
                    reg_person_info.FirstName);

但该值始终为空。我假设,一旦我退出 INIT_REG_PERSON_INFO(arg1,arg2, ... ); ,变量就会被删除/重置;

如何使函数调用之间的值保持不变?

【问题讨论】:

  • 你最初在哪里声明reg_person_info?你能发布那段代码/文件吗?
  • 你的“C”函数显然不是 C 而是 C++。
  • 如果这确实是一个全局变量,并且您不玩共享库的加载和卸载游戏,则该值必须在程序的同一运行期间保持不变。

标签: c++ c


【解决方案1】:

您需要为reg_person_info 结构创建一个external 链接。通过这种方式,您隐含地说“我希望所有声明它的单元都可以使用它,包括主声明单元”。

在您拥有的文件的开头:

STATUS LNPUBLIC BCC_InitRegPersonInfo(char *FirstName){...}

简单地说extern typeOfReg_Person_Info reg_person_info;

从你的代码 sn-p 看,我假设你已经在头文件的某处声明了 reg_person_info 并在你需要的头文件中声明了 #include?一旦我在问题中看到更多代码,我会更新我的答案。

【讨论】:

  • 是的,我已经声明了 extern REG_PERSON_INFO reg_person_info;在标题中。使用此头文件的所有函数都存在于同一个 .cpp 文件中。不幸的是,在链接时,我收到以下错误错误 LNK2001: unresolved external symbol reg_person_info
  • @UlrichKrause 但您需要先在头文件中声明它(不带 extern) - 然后在 .cpp 文件中再次声明它(使用 extern 关键字)。这将启用外部链接,并确保其中一项功能所做的任何更改都是全局可见的
  • >> 然后使用 extern 关键字在您的 .cpp 文件中再次声明它。谢谢
【解决方案2】:

我看到并经常在单元之间共享全局变量的一种做法是:

/* globals.h */
#ifndef EXTERN
#define EXTERN extern
#endif

EXTERN int gMyGloablVar;

/* some-other-C-file */
#include "globals.h"

/* main.c */
#define EXTERN
#include "globals.h"

在 main.c 中分配了存储空间;在所有其他编译单元中,它们的变量被声明为 extern,因此是已知的。在链接时,链接器会修复对 main 中变量的所有引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多