2

我的 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
4

1 回答 1

2

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

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

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

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

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

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

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

会编译得很好。

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

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

注意const这里的第二个,这意味着不能重新分配指针。这应该可以解决链接器错误。

希望这可以帮助!

于 2012-06-21T20:49:45.603 回答