C++ 在 extern 返回错误时在 cpp 文件之间使用变量
C++ using variables between cpp files when extern is returning errors
我想做的是使用 glUseProgram();这是一个 OpenGL 函数
但是也使用它 returns 问题....
为什么?
因为显然即使在声明一个单独的头文件时
使用声明的外部变量,然后在我的 main.cpp 文件中使用它
和用户定义的 OpenGL 引擎结构定义给我错误
使用 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
我得到的错误是:
Error 3 error LNK1169: one or more multiply defined symbols found
这发生在我的原始文件中,而不是测试用例,但我希望它应该这样说。
你不应该在头文件中定义一个变量,否则如果你在多个源文件中包含这样的头文件,你会得到上面的错误。
extern int ProgramID = whateverfunctionyouwant();
只需使用extern声明即可
extern int ProgramID;
然后在其中一个源文件中定义它
这里要记住两点:
- 当您包含一个 header 文件时,实际上是将其文本包含到您的 C 文件中。这意味着在行
extern int ProgramID = whateverfunctionyouwant();
中包含 header 将在每个 C 文件中声明和定义变量 ProgramID
。
- extern变量无论在什么地方使用都需要声明,但只定义一次。定义必须采用不带
extern
关键字的声明形式。这将告诉编译器为变量分配多少存储空间等。
要使用此信息,请将您的 variable_header.hpp
更改为仅声明一个 extern,而不是分配它(确保包括 header 守卫):
#ifndef __VARIABLE_HEADER_HPP__
#define __VARIABLE_HEADER_HPP__
extern int ProgramID;
#endif
并只修改一个源文件(比如 OGL_Engine.cpp
)以全局声明变量(在文件中但在任何函数、class、结构或命名空间之外):
int ProgramID = whateverfunctionyouwant();
您的示例缺少的是 C 文件或匹配的 header 中的 #include "variable_header.hpp"
。假设 include 在那里,编译器将知道 ProgramID
指的是在别处声明的名称,并将在链接阶段将其匹配到正确的内存位置。当编译器到达定义变量的文件时,将用正确的符号标记它,而不管它是否在该文件中 extern
。这发生在全局声明的任何变量上。
我想做的是使用 glUseProgram();这是一个 OpenGL 函数 但是也使用它 returns 问题....
为什么?
因为显然即使在声明一个单独的头文件时 使用声明的外部变量,然后在我的 main.cpp 文件中使用它 和用户定义的 OpenGL 引擎结构定义给我错误 使用 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
我得到的错误是:
Error 3 error LNK1169: one or more multiply defined symbols found
这发生在我的原始文件中,而不是测试用例,但我希望它应该这样说。
你不应该在头文件中定义一个变量,否则如果你在多个源文件中包含这样的头文件,你会得到上面的错误。
extern int ProgramID = whateverfunctionyouwant();
只需使用extern声明即可
extern int ProgramID;
然后在其中一个源文件中定义它
这里要记住两点:
- 当您包含一个 header 文件时,实际上是将其文本包含到您的 C 文件中。这意味着在行
extern int ProgramID = whateverfunctionyouwant();
中包含 header 将在每个 C 文件中声明和定义变量ProgramID
。 - extern变量无论在什么地方使用都需要声明,但只定义一次。定义必须采用不带
extern
关键字的声明形式。这将告诉编译器为变量分配多少存储空间等。
要使用此信息,请将您的 variable_header.hpp
更改为仅声明一个 extern,而不是分配它(确保包括 header 守卫):
#ifndef __VARIABLE_HEADER_HPP__
#define __VARIABLE_HEADER_HPP__
extern int ProgramID;
#endif
并只修改一个源文件(比如 OGL_Engine.cpp
)以全局声明变量(在文件中但在任何函数、class、结构或命名空间之外):
int ProgramID = whateverfunctionyouwant();
您的示例缺少的是 C 文件或匹配的 header 中的 #include "variable_header.hpp"
。假设 include 在那里,编译器将知道 ProgramID
指的是在别处声明的名称,并将在链接阶段将其匹配到正确的内存位置。当编译器到达定义变量的文件时,将用正确的符号标记它,而不管它是否在该文件中 extern
。这发生在全局声明的任何变量上。