as400 ILE C全局变量多重重新定义

时间:2016-09-10 00:54:15

标签: c global linker-errors undefined-reference redefinition

我在as400上有一个ILE C项目,在链接时,如果我将全局变量设置为extern,则会给我一个错误的多次重新定义全局变量或未定义的引用。

以下是最简单形式的代码:

主:

#include "Header1"

int main(int argc, char** argv){
    int x = Foo();
    return 0;
}

头1

#ifndef HEADER1
#define HEADER1

struct MyStruct{
    int x;
};

struct MyStruct g_myStruct; /* My global struct variable. */

int Foo(void);

#endif

Header1实现

#include "Header1"
#include "Header2"

int Foo(void){
    g_myStruct.x = 432;
    return Bar();
}

头2

#ifndef HEADER2
#define HEADER2

int Bar(void);

#endif

Header2实现

#include "Header2"
#include "Header1"

int Bar(void){
    return g_myStruct.x;
}

每个文件编译都很好。只有当我尝试链接它们时,我才会收到以下错误:

Multiple strong definitions  . . . . . . . . . :   2
    Symbol    Type      Library     Object      Bound       Identifier
              *MODULE   MYLIB       1          *YES        g_myStruct
              *MODULE   MYLIB       I2          *YES        g_myStruct 

在我的全局结构声明前面使用extern关键字,我收到此错误:

Unresolved references  . . . . . . . . . . . . :   2
    Symbol    Type      Library     Object      Bound       Identifier
              *MODULE   MYLIB       I1          *YES        g_myStruct
              *MODULE   MYLIB       I2          *YES        g_myStruct 

2 个答案:

答案 0 :(得分:1)

您在几个不同的源文件中包含文件header1.h

这会导致g_myStruct的几个不同实例,从而导致多次重新定义。

在文件extern中声明此变量header1.h,并在一个源文件中对其进行实例化。

例如:

文件header1.h:

extern struct MyStruct g_myStruct; /* My global struct variable. */

文件header1.c:

struct MyStruct g_myStruct; /* My global struct variable. */

答案 1 :(得分:1)

全局变量的工作方式与全局函数非常相似。

在头文件中,您输入了一个声明。对于函数,这看起来像:

int Foo(void);  // or 'extern int Foo(void);'

对于变量,您需要extern(这对函数来说是可选的):

extern struct MyStruct g_myStruct;

然后,在实现文件中,您将定义:

#include "Header1"

struct MyStruct g_myStruct;

int Foo(void){
    ...
}