外部结构和多个标题

时间:2012-11-27 14:38:24

标签: c struct extern

我对外部结构感到困惑。我必须在除定义结构之外的文件中定义结构的全局实例(作为RAM变量,我不知道它究竟是什么)。

以下是GCC可以编译的示例,它运行正确,而Code Composer Studio会产生编译时错误。

我想了解问题所在,GCC如何编译,以及我应该在何处/如何使用extern声明。

任何评论都将不胜感激。

person.h

#ifndef PERSON_H
#define PERSON_H
struct person {
    int age;
};
typedef struct person PERSON;
void modifyPerson();
#endif // PERSON_H

personRam.h

#ifndef PERSONRAM_H
#define PERSONRAM_H
#include "person.h"
PERSON p1;
#endif // PERSONRAM_H

modifyPerson.c

#include "person.h"
#include "personRam.h"
void modifyPerson() {
    p1.age = 10;
}

main.c中

#include <stdio.h>
#include "person.h"
#include "personRam.h"
int main() {
    modifyPerson();
    printf("%d", p1.age);
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您不应该收到编译器错误,而是链接器错误,说明p1已定义多次。至少我认为这就是问题所在。

原因是您在头文件中定义变量,然后将其包含在多个源文件中。这意味着定义在两个源文件中(预处理器#include指令字面地将头文件的内容放在include&#34;语句&#34;)的位置。

如果你在头文件中变量声明为extern,并且在一个源文件中定义它应该可以工作。

所以在personRam.h

extern PERSON p1;

在其中一个源文件中:

PERSON p1;

答案 1 :(得分:1)

您正在编译哪个操作系统,以及针对哪个目标系统?

对于它的价值,Linux(&amp; Unix-es)和Windows具有不同的链接语义。 有关详细信息,请阅读Levine's "Linkers & Loaders"本书。