简体   繁体   中英

how can I use a pointer to global struct in ansi-c?

Here is the case. In the file "fileA.c" I have

typedef struct MY_STRUCT
{
  int A;
  int B;
  int C;
}MY_STRUCT;

MY_STRUCT Data;

/* Function */
int function(MY_STRUCT *params)
{
  int varA, varB, varC;

  varA = params->A;
  varB = params->B;
  varC = params->C;
}

And I need to fill the struct elements from other routine, for instance, "fileB.c" which contains the following:

extern MY_STRUCT Data;

int function(MY_STRUCT *params);

/* Function  */
void userMain(void)
{
  Data.A = 1254;
  Data.B = 5426;
  Data.C = 1236;

  function(&Data);
}

But I'm getting the error:

"[Error] fileB.c E208: syntax error - token ";" inserted before "Data"

And whe I cross probe the error the compiler take me to the declaration "extern MY_STRUCT Data;"

So my question is how do I accomplish this functionality? I mean, how do I fill the elements of the structure from another function in another file different from the file where I declared the struct?

When the compiler is compiling fileB.c , it doesn't know about the typedef that you've defined in fileA.c . So in fileB.c, MY_STRUCT is an unknown type.

You should move the typedef to a common header, and include it in fileA.c and fileB.c.

Elaborating a bit on @pb2q answer:

Create a filea.h file with (omitting the defines and stuff):

struct MY_STRUCT
{
(blah blah blah ...)
};

extern MY_STRUCT Data;

This will declare the struct and tell whoever wants to know that the variable is declared in another file. Then put in filea.c the following lines

#include "filea.h"     // near the top
(...)
MY_STRUCT Data;    // Somewhere meaningful

This will actually declare the variable Data. Finally, in file "fileb.c" type

#include "filea.h"

that allows you to use the variable Data.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM