我在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
答案 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){
...
}