[英]C++ using variables between cpp files when extern is returning errors
我想做的是使用glUseProgram(); 这是OpenGL函数,但也使用它会返回问题。
为什么?
因为很明显,即使使用声明的extern变量声明单独的头文件时,也可以在main.cpp文件和用户定义的OpenGL Engine结构定义中使用它,这给我带来了MSVC 2013错误
这是仅使用通用c ++的测试用例:
variable_header.hpp
extern int ProgramID = whateverfunctionyouwant();
OGL_Engine.hpp
#ifndef __OGL_ENGINE_HPP__
#define __OGL_ENGINE_HPP__
struct OGL_Engine {
int Setup();
int ShaderSetup();
};
#endif
OGL_Engine.cpp
#ifndef __OGL_ENGINE_CPP__
#define __OGL_Engine_CPP__
int OGL_Engine::Setup(){
int whatever = 0;
}
int OGL_Engine::ShaderSetup(){
int readfile = 0;
afunctionyouwant(ProgramID);
}
#endif
我得到的错误是:
错误3错误LNK1169:找到一个或多个乘法定义的符号
这发生在我的原始文件中,而不是测试用例中,但是我希望可以这样说。
这里要记住两件事:
extern int ProgramID = whateverfunctionyouwant();
中包含标头extern int ProgramID = whateverfunctionyouwant();
将在每个C文件中声明和定义变量ProgramID
。 extern
关键字的声明形式。 这将告诉编译器为变量分配多少存储空间,等等。 要使用此信息,请将您的variable_header.hpp
更改为仅声明一个外部variable_header.hpp
,而不分配它(确保包括标头保护符):
#ifndef __VARIABLE_HEADER_HPP__
#define __VARIABLE_HEADER_HPP__
extern int ProgramID;
#endif
并仅修改一个源文件(例如OGL_Engine.cpp
)以全局声明变量(在文件中,但在任何函数,类,结构或名称空间之外):
int ProgramID = whateverfunctionyouwant();
您的示例缺少的是C文件或匹配的标头中的#include "variable_header.hpp"
。 假定包含文件存在,编译器将知道ProgramID
引用在其他地方声明的名称,并在链接阶段将其与正确的内存位置进行匹配。 当编译器到达定义该变量的文件时,无论该文件中是否存在extern
变量,都将使用正确的符号对其进行标记。 全局声明的任何变量都会发生这种情况。
您不应在头文件中定义变量,否则,如果在多个源文件中包含这样的头文件,则会出现上述错误。
extern int ProgramID = whateverfunctionyouwant();
只需使用extern声明它
extern int ProgramID;
然后在源文件之一中定义它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.