繁体   English   中英

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

[英]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:找到一个或多个乘法定义的符号

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

这里要记住两件事:

  1. 当包含头文件时,实际上是将其文本包含在C文件中。 这意味着在行头extern int ProgramID = whateverfunctionyouwant();中包含标头extern int ProgramID = whateverfunctionyouwant(); 将在每个C文件中声明和定义变量ProgramID
  2. 无论在哪里使用,都需要声明一个extern变量,但只能定义一次。 该定义必须采用不含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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM