【问题标题】:Extern stuct in C source filesC 源文件中的外部结构
【发布时间】:2012-11-08 23:59:34
【问题描述】:

我试图在两个单独的 .c 文件中提供一个名为 dict_obj 的 dictionary_object 结构。这是在尝试为类编写 pthread TCP 服务器时。我以前没有用 C 做太多工作,并且很难弄清楚这一点。我不确定我是否正确地将其声明为外部结构,因为 netbeans 会在 clean 和 build 上抛出错误,说无效使用未定义的类型。

在 db_functions.c 我有:

//------------------------------------------------------------------------------
//                Server Function & Variable Initialization 
//------------------------------------------------------------------------------

struct dictionary_object dict_obj;


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//                            Server Function Codes:
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------



//------------------------------------------------------------------------------
//                         Database Initialization
//------------------------------------------------------------------------------

int db_initialization()
{

    dict_obj.word_count = 0;
    return 1;

在 db_operations.c 我有:

struct dictionary_object
{
    char dictionary[DICTIONARY_SIZE][WORD_LENGTH];
    int word_count;
    pthread_mutex_t dict_mutex;

};

extern struct dictionary_object dict_obj;

希望这能让你们充分了解我想要完成的工作,而不必用太多代码让你们不知所措。提前致谢!如果您需要查看更多代码,请告诉我。

【问题讨论】:

  • 您的问题/问题到底是什么?
  • 嗯,你的实际问题是什么?

标签: c struct pthreads mutex extern


【解决方案1】:

您需要在包含文件中定义一次结构内容和布局。还要为那里的代码定义所有函数和静态的“外部”定义。在任何想要使用这些结构或定义的文件中,包括头文件(类似于 db_struct.h)。

db_struct.h:

struct dictionary_obhect {
   char dictionary ...
}
extern struct dictionary_object dict_obj;
extern int db_initialization();

db_struct.c:

#include "db_struct.h"

struct dictionary_object dict_obj;
int db_initiatilization() {
    dict_obc.word_count = 0;
}

请注意,这都是非常老式的 C 代码。现代 C++ 等有其他方法可以做类似的事情。

【讨论】:

  • 对于int db_initialization();,您不需要extern
【解决方案2】:

我会冒昧地猜测您的问题是 C 编译器在编译 db_functions.c 时抱怨它不知道如何为 struct dictionary_object 分配内存。它的混乱是可以理解的,因为您要求它编译的文件根本没有告诉它struct dictionary_object 是什么。

您应该将结构的定义移动到您的两个.c 文件都包含的头文件

【讨论】:

  • 有什么方法可以将它保存在现有的 c 文件中并使其工作?
  • @user1048382:你为什么要这么做?如果将定义放在.c 文件中,则必须确保 每个 .c 文件中出现 same 定义,如果需要更改它稍后您将需要在任何地方更改它,如果您忘记更改其中一个副本,则会产生很大的错误风险。将它放在.h 文件中的意义在于,它只允许您编写一次定义。
  • (如果你不小心把不同的定义放在不同的.c文件中,它们看起来编译和链接OK,但是两次编译产生的机器码将基于关于结构的内存布局的不同假设,因此它们在运行时无法正常工作)。
  • 只是出于知识目的...您知道仅供参考,但仅供参考。不是故意让你不高兴或冒犯你。
猜你喜欢
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2012-07-25
  • 2012-04-29
  • 2014-06-28
  • 2017-07-11
  • 1970-01-01
  • 2023-02-25
相关资源
最近更新 更多