即使有警卫,编辑也会抱怨重新定义

时间:2014-02-28 00:40:57

标签: c++ namespaces glfw redefinition

我正在尝试为OpenGL应用程序设置一些日志记录功能。 GLFW提供了注册回调函数的选项,该函数在发生错误时被调用,但由于它是C库,因此它要求函数以C风格编写,即在类之外。因此,我将日志记录功能放入文件log.h中定义的命名空间。

#ifndef LOG_H
#define LOG_H

#include <fstream>

namespace gllog{    
  #define GL_LOG_FILE "gl.log"
  bool restart_gl_log(){
    //...
  }

  bool gl_log (const char* message, const char* filename, int line){
    //...
  }

  void glfw_error_callback (int error, const char* description){
    //...
  }  
};
#endif

即使我添加了包含警卫,每当我从两个不同的文件中包含此文件时,我都会收到如下错误:

CMakeFiles/gl4tuts.dir/extended_initialisation/ExtendedInitialisation.cpp.o: In function `gllog::glfw_error_callback(int, char const*)':
ExtendedInitialisation.cpp:(.text+0x340): multiple definition of `gllog::glfw_error_callback(int, char const*)'
CMakeFiles/gl4tuts.dir/hello_triangle/HelloTriangle.cpp.o:HelloTriangle.cpp:(.text+0xa10): first defined here

我正在使用CMake构建。

可能是什么原因?班级缺席是否可以相关?

1 个答案:

答案 0 :(得分:1)

在编译相同的.cpp文件时,包含保护可以防止您多次包含相同的头文件。它们不会阻止您在编译不同的.cpp文件时多次包含相同的头文件 - 实际上它们通常用于在不同的编译单元中使相同的类可用。

顺便说一下,编译器没有抱怨链接器。