0

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

下面是一个 GCC 可以编译并且运行正确的示例,而 Code Composer Studio 给出了编译时错误。

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

任何评论将不胜感激。

人.h

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

人拉姆.h

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

修改人.c

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

主程序

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

2 回答 2

3

你不应该得到一个编译器错误,而是一个链接器错误,说它p1被定义了多次。至少这就是我认为的问题所在。

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

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

所以在personRam.h

extern PERSON p1;

在其中一个源文件中:

PERSON p1;
于 2012-11-27T14:44:43.577 回答
1

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

值得一提的是,Linux(和 Unix-es)和 Windows 具有不同的链接语义。阅读Levine 的“链接器和加载器”一书了解详细信息。

于 2012-11-27T14:40:44.453 回答