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

时间:2015-12-31 01:41:46

标签: c++ extern

我想做的是使用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:找到一个或多个多重定义的符号

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

2 个答案:

答案 0 :(得分:1)

这里要记住两件事:

  1. 当您包含头文件时,您实际上将其文本包含在C文件中。这意味着包含带有行extern int ProgramID = whateverfunctionyouwant();的标题将在每个C文件中声明和定义变量ProgramID
  2. 外部变量需要在任何地方声明,但只能定义一次。该定义必须采用不带extern关键字的声明形式。这将告诉编译器为变量分配多少存储空间等。
  3. 要使用此信息,请将variable_header.hpp更改为仅声明extern,而不是指定它(确保包含标题保护):

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

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

    int ProgramID = whateverfunctionyouwant();
    

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

答案 1 :(得分:0)

您不应在头文件中定义变量,否则如果在多个源文件中包含此类头文件,则会出现上述错误。

extern int ProgramID = whateverfunctionyouwant();

只需使用 extern 来声明

extern int ProgramID;

然后在源文件

中定义它