4

我希望在源文件main.csecond.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不正确?

4

3 回答 3

6

问题在于范围。您的变量 ( fo& ba) 具有局部范围,因为它们在 . 内声明。因此main,它们的可见性仅限于main函数内。请使它们成为全局变量,它应该可以工作。

于 2012-07-19T08:58:52.103 回答
3

错误消息表明链接器无法找到foba. 通过extern声明,您已经告诉编译器变量将存在于其他翻译单元中,但它们不存在。

您需要将struct foo fo;and移到函数struct bar ba;之外。main()现在,它们是函数局部变量。它们需要是全局变量才能工作。

于 2012-07-19T08:59:17.187 回答
1

主.h:

typedef struct
{
    double v;
    int i;
} Foo;

外部.h:

extern Foo fo; // "fo is a global variable stored somewhere else"

主.c:

#include "main.h"
#include "extern.h"
//use fo.v here

第二个.c:

#include "second.h"
#include "main.h"
#include "extern.h"
Foo fo; // "store the data of fo here"
//use fo.v here

只需在您要使用的所有 .c 文件中包含#include "main.h"和。请注意,这仅在 second.c 中,没有其他地方。#include "extern.h"foFoo fo

于 2016-04-07T07:09:51.780 回答