gpt4 book ai didi

c++ - 为什么我可以在头文件中声明一个数组,而不能声明一个指针?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:54:59 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

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

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

将编译得很好。

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

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

注意这里的第二个const,意思是指针不能被重新赋值。这应该可以解决链接器错误。

希望这对您有所帮助!

关于c++ - 为什么我可以在头文件中声明一个数组,而不能声明一个指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11146447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com