将结构定义为extern

时间:2015-11-21 07:28:21

标签: c structure

我正在处理多个文件,其中所有文件都已链接。我有一个在大多数文件中使用的结构。

这就是我正在做的事情:我在一个文件data.c中初始化结构,我在另一个文件user.c中定义它。我这样做是因为代码序列的方式是通过调用data.c中的函数data_init()在main()函数中初始化数据,并从用户的套接字读取结构的值.C

因为在许多其他文件中引用了这个结构,所以我在data.h中将它声明为extern(因为我在data.c中初始化了结构)

现在问题是我在file3.c中使用这个结构,我应该得到user.c中定义的值,但是我收到的是之前在结构上的值。不是读入user.c中结构的当前值。

我不明白为什么会发生这个错误。我无法附加代码,因为在太多文件中引用了结构。

任何建议都会有很大帮助。 谢谢!

编辑:我正在使用以下文件。我很抱歉极度拖延。 PS:除了结构我还将一个标志定义为extern,我在file3.c中访问的值不是预期的。

types.h中:

#include<stdio.h>
#include<stdlib.h>


typedef struct
{
 int num;
 char name[10];
}struct1;

typedef struct
{
  int num;
  char status[10];
}struct2;

data.c

#include"data.h"

//Globals:
struct1 packet;
struct2 packet2;

void data_init(void)
{
  memset(packet, 0 ,sizeof(packet));
  memset(packet2, 0, sizeof(packet2));
}

data.h:

#include"types.h"

extern struct1 packet;
extern struct2 packet2;

void data_int(void);

user.c的

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>

#include"data.h"
#include "user.h"
#include "file3.h"

//Globals:
 int flag = 0;

void read_socket(void)
{
  int bytes, number;

  bytes = recv(cli_sock, &packet, sizeof(packet), MSG_DONTWAIT);
  if (bytes > 0)
  {
     flag = 1;
     number = packet.num
     switch(number)
     {
         //cases depending on value of number
         case 3:
         case 4:
          check_param(); //function in file3.c
          break;
     }
   }
}

user.h:

extern int flag;

file2.c中

#include"data.h"

void write_socket(void)
{
  serialise_send(&packet2); //send data after serialisation
  flag = 0;
}

file3.c中

#include"data.h"
#include"file2.h"


void check_param(void)
{
   if(flag) // sometimes the value of the flag is also not set
   {
      int number;

      number = packet1.num;
      if (number > 2) // this is where I dont get the cuurent value of   the structure which is read in user.c
      {
         printf("\n%d\n",number);
         packet2.age = number;
         packet2.name = "success";
         write_to_socket(); // function in file2.c
      }

   }
}

的main.c

#include"data.h"

 void main()
 {
  data_init();
  poll_add(); //add poll functions for sockets to poll infinitely
  while((polling)); //if poll returns success for infinite time, program stays here
 }

2 个答案:

答案 0 :(得分:0)

.h file

中声明结构变量

对于Eg;

struct abc
{
  //members
};

extern struct abc val;

现在在所有文件中包含.h文件。 然后所有文件将具有相同的结构视图。 确保在其中一个文件中定义结构变量。

答案 1 :(得分:0)

  

现在问题是我在file3.c中使用这个结构,我在哪里   应该得到user.c中定义的值,但我收到一个值   以前是在结构上。不是当前值   读入user.c中的结构。

您读入了user.c中的结构对象packet,但是在file3.c中,您检查了不同的结构对象packet1