如何以及在何处调用外部定义的结构

时间:2012-04-26 13:05:30

标签: c static extern linkage

file:element.h

#ifndef ELEMENT_H
#define ELEMENT_H 

typedef struct Elem {
  char * itag;
  char * cont;
  char * etag;
  struct Elem * previous;
} Element;

void printElement ( Element * );
#endif /* ELEMENT_H */

我在element.h和element.c中声明并定义了一个结构Element(未显示,但执行了malloc)。

文件parser.c的其中一项功能应该是Element。 如果某些条件适用,则会创建一个指向Element的新指针,其中一个指针属性将被填满。 之后的一些迭代,如果某些其他条件适用,则另一个指针属性获得一些文本。 然后,当满足某些其他条件时,应将指向Element的指针传递给另一个文件的函数:output.c

我的问题是:我应该如何以及在何处致电Element。 如果在if条件内创建指针,那么它就是一个自动变量。迭代函数时不可见。

我可以声明它static,但编译器返回错误error: 'e' undeclared (first use in this function)。例如:在迭代1中,指针在if语句的一个分支中创建;在迭代2中,访问if的另一个分支,我执行e->etag = "a";

之类的操作

如果我声明extern Element * e;,请在if的第二个分支(第一个else if)中收到相同的错误。

file output.c

#include element.h
write_element ( Element * e )
{
    write_to_disk(... e->itag, e->etag);
}

file parser.c

#include "element.h"

# some other functions
void parser ( char * f, char * b )
{
    if ( something ) {
        /* Need to access externally defined Element type structure, but it should be visible in all `parser` function */
        Element * e;
        e->itag = ... realloc(...)
        ...

    } else if (..... ) {
        /* Should assume a pointer to Element is already created */
        e->etag = "a";

    } else if ( .... ) {
        /* Should assume a pointer to Element is already created */
        /* and itag, etag and cont have some text */
        write_element( e );
    }

2 个答案:

答案 0 :(得分:1)

代码

typedef struct Elem {
  char * itag;
  char * cont;
  char * etag;
  struct Elem * previous;
} Element;

未定义元素。它只告诉编译器它的结构。没有定义一个元素。

尝试

extern Element myElement;

在头文件中。

在相应的.c档案中

Element myElement;

这将为myElement

预留空间

答案 1 :(得分:1)

您应该使用关键字«extern»。例如:

f.h:

#ifndef H_LP_F_20120426154230   
#define H_LP_F_20120426154230 

typedef struct Elem {
    char *itag;
    char *cont;
    char *etag;
    struct Elem *previous;
} Element;

extern Element myStruct;

#endif

<强> F.C

#include "f.h"

Element myStruct;
/* nom I can use myStruct */