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;

然后在其中一个源文件中定义它

这里要记住两点:

  1. 当您包含一个 header 文件时,实际上是将其文本包含到您的 C 文件中。这意味着在行 extern int ProgramID = whateverfunctionyouwant(); 中包含 header 将在每个 C 文件中声明和定义变量 ProgramID
  2. 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 。这发生在全局声明的任何变量上。