为什么我可以在头文件中声明一个数组,但不是指针?

时间:2012-06-21 20:44:58

标签: c++ pointers namespaces linker-errors

我的Consts.hpp文件有问题:

#pragma once
#include <stdafx.h>

namespace consts {
    const GLchar* TEXTURE_DIR = "../../blabla/"; // doesn't work
    const GLchar TEXTURE_DIR[14] = "../../blabla/"; // works
};

此文件已添加到stdafx.h文件中。 ColladaReader.cpp是我访问TEXTURE_DIR的文件。 为什么指针在命名空间中不起作用?访问常量时,我​​收到此错误:

 Error  5   error LNK2005: "char const * const consts::TEXTURE_DIR" (?TEXTURE_DIR@consts@@3PBDB) already defined in ColladaReader.obj   D:\Privat\code\openglearn\projects\ColladaReader\stdafx.obj

1 个答案:

答案 0 :(得分:2)

这里的问题是,如果您将此代码放在头文件中,则包含它的每个.cpp文件都会认为它具有consts::TEXTURE_DIR的唯一副本。这会在编译代码时导致链接器错误,因为链接器将找到此变量的多个副本,并且不知道它应该使用哪个副本。

第一个版本不起作用而第二个版本的原因是微妙的。在C ++中,文件范围内的任何常量都自动具有内部链接,因此可以避免上述问题(因为链接器将每个副本视为单独的)。声明数组时,数组本身是常量:

const GLchar TEXTURE_DIR[14] = "../../blabla/"; 

但是,您声明的指针不是常量:

const GLchar* TEXTURE_DIR = "../../blabla/"; 

这样做的原因是指针指向GLchar s是常量,但指针本身可以重新分配。例如,行

consts::TEXTURE_DIR = "Now I'm different!"

编译得很好。

要解决此问题,请更改指针声明,使其成为常量指针:

const GLchar* const TEXTURE_DIR = "../../blabla/"; 

注意这里的第二个const,这意味着无法重新分配指针。这应解决链接器错误。

希望这有帮助!