gpt4 book ai didi

C++ 在 extern 返回错误时在 cpp 文件之间使用变量

转载 作者:行者123 更新时间:2023-11-28 05:54:21 24 4
gpt4 key购买 nike

我想做的是使用 glUseProgram();这是一个 OpenGL 函数但是太用它会返回问题....

为什么?

因为显然即使在声明一个单独的头文件时使用声明的外部变量,然后在我的 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

这发生在我的原始文件中,而不是测试用例中,但我希望它应该这样说。

最佳答案

这里要记住两点:

  1. 当您包含头文件时,实际上是将其文本包含到您的 C 文件中。这意味着包含带有 extern int ProgramID = whateverfunctionyouwant(); 行的 header 将在每个 C 文件中声明和定义变量 ProgramID
  2. 外部变量无论在何处使用都需要声明,但只定义一次。定义必须采用不带 extern 关键字的声明形式。这将告诉编译器要为变量分配多少存储空间等。

要使用此信息,请将您的 variable_header.hpp 更改为仅声明一个 extern,而不是分配它(确保包含 header 保护):

#ifndef __VARIABLE_HEADER_HPP__
#define __VARIABLE_HEADER_HPP__
extern int ProgramID;
#endif

并仅修改一个源文件(例如 OGL_Engine.cpp)以全局声明变量(在文件中但在任何函数、类、结构或命名空间之外):

int ProgramID = whateverfunctionyouwant();

您的示例缺少的是 C 文件或匹配 header 中的 #include "variable_header.hpp"。假设 include 存在,编译器将知道 ProgramID 引用别处声明的名称,并将在链接阶段将其匹配到正确的内存位置。当编译器到达定义变量的文件时,将用正确的符号标记它,而不管它是否在该文件中是 extern。这发生在全局声明的任何变量上。

关于C++ 在 extern 返回错误时在 cpp 文件之间使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34539892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com