2016-09-10 22 views
0

我在as400上有一个ILE C projet,当它被链接时,给我一个全局变量的多重定义的错误或者如果我把全局变量extern给定为未定义的引用。as400 ILE C全局变量多重定义

这是最简单的形式代码:

主:

#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 

头1实现

#include "Header1" 
#include "Header2" 

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

头2

#ifndef HEADER2 
#define HEADER2 

int Bar(void); 

#endif 

头2执行

#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 
+0

为什么您的标题不以'.h'结尾? –

+0

你也忘记了Header1实现中的分号:'g_myStruct.x = 432'但修复它必须编译,你能显示错误吗? –

+0

@AlterMann as400 QSYS文件系统中没有.h。 –

回答

1

你包括文件header1.h在几个不同的源文件中。

这导致g_myStruct的多个不同实例,因此多重定义。

申报文件header1.h这个变量extern,并在源文件中的一个实例化。


例如:

文件那么header1.h:

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

文件header1.c:

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

全局变量的工作很像全局函数。


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

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

对于变量,你需要extern(这是可选功能):

extern struct MyStruct g_myStruct; 

然后,在实现文件中,你把定义:

#include "Header1" 

struct MyStruct g_myStruct; 

int Foo(void){ 
    ... 
} 
+0

@ melpomene @barak manos两个正确的答案在同一时间。谢谢。你知道为什么我必须这样做吗?这是多久C工作?我的例子中的代码与GCC完美协作,但在ILE中,我必须按照你所说的去做。 –

+0

@BobMarl:就编译器而言,每个源文件都是一个独立的编译单元。换句话说,编译器在任何之前的源文件“没有回忆”,而它正在处理当前的源文件。但是,链接器会检测同一符号的多个定义。底线,'extern'只是让编译器知道变量存在并被声明在某处。当然,它仍然需要在某个地方声明(实例化),并且**只有一次** - 否则链接器将发出错误。 –

+0

@BobMarl这仍然是C的工作原理。说实话,我不知道它为什么在gcc中起作用。 – melpomene