Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
as400 ILE C全局变量多重重新定义_C_Global_Linker Errors_Undefined Reference_Redefinition - Fatal编程技术网

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

as400 ILE C全局变量多重重新定义,c,global,linker-errors,undefined-reference,redefinition,C,Global,Linker Errors,Undefined Reference,Redefinition,我在as400上有一个ILE C项目,当被链接时,它会给我一个全局变量多重重新定义的错误,或者如果我将全局变量外部化,则会给我一个未定义的引用 以下是最简单形式的代码: 主要内容: 校长1 #ifndef HEADER1 #define HEADER1 struct MyStruct{ int x; }; struct MyStruct g_myStruct; /* My global struct variable. */ int Foo(void); #endif 标题1实

我在as400上有一个ILE C项目,当被链接时,它会给我一个全局变量多重重新定义的错误,或者如果我将全局变量外部化,则会给我一个未定义的引用

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

主要内容:

校长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();
}
#include "Header2"
#include "Header1"

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

#ifndef HEADER2
#define HEADER2

int Bar(void);

#endif
标题2实施

#include "Header1"
#include "Header2"

int Foo(void){
    g_myStruct.x = 432;
    return Bar();
}
#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 

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

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

在文件
header1.h
中声明此变量
extern
,并在源文件的一个中实例化它


例如:

文件头1.h:

extern struct MyStruct g_myStruct; /* My global struct variable. */
struct MyStruct g_myStruct; /* My global struct variable. */
文件头1.c:

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

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

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

在文件
header1.h
中声明此变量
extern
,并在源文件的一个中实例化它


例如:

文件头1.h:

extern struct MyStruct g_myStruct; /* My global struct variable. */
struct MyStruct g_myStruct; /* My global struct variable. */
文件头1.c:

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

全局变量的工作原理与全局函数非常相似


在头文件中,您放置了一个声明。对于函数,如下所示:

int Foo(void);  // or 'extern int Foo(void);'
对于变量,您需要
extern
(这对于函数是可选的):


然后,在实现文件中,放置以下定义:

#include "Header1"

struct MyStruct g_myStruct;

int Foo(void){
    ...
}

全局变量的工作原理与全局函数非常相似


在头文件中,您放置了一个声明。对于函数,如下所示:

int Foo(void);  // or 'extern int Foo(void);'
对于变量,您需要
extern
(这对于函数是可选的):


然后,在实现文件中,放置以下定义:

#include "Header1"

struct MyStruct g_myStruct;

int Foo(void){
    ...
}

为什么您的头不以
.h
结尾?您还忘记了头1实现中的分号:
g_myStruct.x=432
,但要解决这个问题,它必须编译,您能显示错误吗?@AlterMann as400 QSYS文件系统上没有.h。@AlterMann这只是一个输入错误。整个过程是编译的,但没有链接。我添加了特定的错误消息。为什么您的头不以
.h
结尾?您还忘记了头1实现中的分号:
g_myStruct.x=432
,但要解决这个问题,它必须编译,您能显示错误吗?@AlterMann as400 QSYS文件系统上没有.h。@AlterMann这只是一个输入错误。整个过程是编译的,但没有链接。我添加了具体的错误消息。@melpomene@barak manos同时给出了两个正确答案。非常感谢。你知道我为什么要这么做吗?这就是C的工作方式吗?我的示例中的代码与GCC完美结合,但在ILE中,我必须按照您所说的去做。@BobMarl:就编译器而言,每个源文件都是一个独立的编译单元。换句话说,编译器在处理当前源文件时“不记得”任何以前的源文件。但是,链接器检测同一符号的多个定义。总之,
extern
只是让编译器知道变量存在并在某个地方声明。当然,它仍然需要在某个地方声明(实例化),并且只能声明一次——否则链接器将发出错误。@BobMarl C仍然是这样工作的。老实说,我不知道为什么它在gcc中有效。@melpomene@barak manos同时给出了两个正确答案。非常感谢。你知道我为什么要这么做吗?这就是C的工作方式吗?我的示例中的代码与GCC完美结合,但在ILE中,我必须按照您所说的去做。@BobMarl:就编译器而言,每个源文件都是一个独立的编译单元。换句话说,编译器在处理当前源文件时“不记得”任何以前的源文件。但是,链接器检测同一符号的多个定义。总之,
extern
只是让编译器知道变量存在并在某个地方声明。当然,它仍然需要在某个地方声明(实例化),并且只能声明一次——否则链接器将发出错误。@BobMarl C仍然是这样工作的。老实说,我不知道为什么它在gcc中工作。