【问题标题】:Sharing data value between functions in C [duplicate]在C中的函数之间共享数据值[重复]
【发布时间】:2018-01-08 14:33:40
【问题描述】:

我在 dbinfo.h viz 中有一个简单的结构。

typedef struct {
   int fields;
} dbinfo;

在我的主程序中:

#include <string.h>
 ...
#include "dbinfo.h"
extern dbinfo *tst_info;

void main() {

tst_info = (dbinfo *) calloc(1, sizeof(dbinfo));

dbinfo.fields = 3;

printf("\n number of fields = %d"), getnumflds());
...
}

在另一个文件utilities.c我有

#include "dbinfo.h"
extern dbinfo *tst_info;

int getnumflds() {

   return tst_info.fields;
}

当我尝试链接时,我在 tst_info 的实用程序.c 中得到未定义的符号。 如果我删除 extern,则不会得到未解析的符号,但字段的值为 0。

我在这里做错了什么?

我只是希望能够在单独编译的其他函数中使用和更改 main 中设置的“字段”的值。

我已经很久没有使用 C 并且无法访问这些神经元了!

【问题讨论】:

  • 没错,多说一点。 Extern 只是告诉“变量是编译器,相信我。”但是你从来没有真正做到过,所以链接器找不到它。只需从其中一个文件中删除 extern。
  • 不明白。在主程序中,我指定它是 extern 并分配它。
  • 当我从主程序中删除 extern,并在子程序中引用“字段”时,即使我在主程序中将它设置为 3,它也是零。
  • 不要滥用外部变量。函数中需要的所有数据都应该作为参数传递给它。
  • 在我看来,您从未在任何地方真正定义符号,这意味着它没有在您的程序中分配地址,因此访问它就变成了纯 UB。您观察到的特定结果只是偶然事件。

标签: c


【解决方案1】:

tst_info 的所有定义都必须是extern 除了一个。某个目标文件中变量的extern 关键字告诉链接器不要在数据段中为其分配空间,因为该变量的存储空间将在其他目标文件中提供。如果所有目标文件都将变量定义为extern,则没有目标文件为其提供存储。

您可以在这篇文章中了解更多关于此的内容: https://stackoverflow.com/a/1433387/773113

【讨论】:

  • 详细信息:“必须是外部的,除了一个”稍微夸大了。 extern int foo; int foo; int foo = 5; 是有效的,因为 int foo; 是一个暂定定义。
  • @chux 是的,但我不确定如何避免夸大其词,同时避免建议一种不可移植因此不可取的做法。
【解决方案2】:

您在两个翻译单元中都将tst_info 声明为externextern 关键字意味着它在其他地方可用,在某些external 翻译中。在某个地方,您需要通过 not 使用extern 关键字来实际定义它,而是设置一个初始值(可以是callocNULL 或其他东西的结果)。

您可能还会发现声明全局dbinfo 比声明dbinfo * 更容易,具体取决于程序的使用情况。您可以从动态运行时分配中移出的数据越多越好。

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 2015-01-09
    • 2015-12-19
    • 1970-01-01
    • 2021-02-21
    • 2021-10-16
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多