我对外部结构感到困惑。我必须在除定义结构之外的文件中定义结构的全局实例(作为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;
}
答案 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"本书。