我想在源文件 main.c 和 second.c 之间访问一些共享变量,我的头文件是 all.h 定义了共享数据类型
#ifndef ALL_H
#define ALL_H
struct foo {
double v;
int i;
};
struct bar {
double x;
double y;
};
#endif
main.c 在下面给出
/* TEST*/
#include "all.h"
#include "second.h"
int main(int argc, char* argv[])
{
struct foo fo; // should be accessed in second.c
fo.v= 1.1;
fo.i = 12;
struct bar ba; // should be accessed in second.c
ba.x= 2.1;
ba.y= 2.2;
sec(); // function defined in second.c
return 0;
}
second.h 在下面给出
#include <stdio.h>
#include "all.h"
int sec();
second.c 在下面给出
#include "second.h"
extern struct foo fo;
extern struct bar ba;
int sec()
{
printf("OK is %f\n", fo.v+ba.x);
return 0;
}
我以为我拥有所有声明并包含标题。但是当我编译时
gcc -o main main.c second.c
or
gcc -c second.c
gcc -c main.c
gcc -o main main.o second.o
会出现一些错误,如
second.o: In function `sec':
second.c:(.text+0x8): undefined reference to `fo'
second.c:(.text+0xe): undefined reference to `ba'
collect2: ld returned 1 exit status
我认为使用extern
的地方错了或我错误地使用了gcc
?
答案 0 :(得分:3)
问题在于范围。您的变量(fo
&amp; ba
)具有在main
内声明的局部范围。因此,它们的可见性仅限于main
函数内。请将它们作为全局变量,它应该可以工作。
答案 1 :(得分:2)
错误消息表明链接器无法找到fo
和ba
。使用extern
声明,您告诉编译器变量将存在于其他一些翻译单元中,但它们不存在。
您需要将struct foo fo;
和struct bar ba;
移到main()
功能之外。现在,它们是函数局部变量。它们需要是全局变量才能发挥作用。
答案 2 :(得分:1)
// main.h
typedef struct
{
double v;
int i;
}foo;
// extern.h
extern foo fo;
// main.c中
#include "main.h"
#include "extern.h"
//use fo.v here
// second.c
#include "second.h"
#include "main.h"
#include "extern.h"
foo fo;
//use fo.v here
只需包含#include&#34; main.h&#34;,#include&#34; extern.h&#34;在你要使用的所有.c文件中。 请注意,foo fo仅在second.c中,而在其他地方