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 ファイルがconsts::TEXTURE_DIR. これにより、コードをコンパイルするときにリンカ エラーが発生します。これは、リンカがこの変数の複数のコピーを検出し、どれを使用すべきかがわからないためです。

最初のバージョンが機能せず、2 番目のバージョンが機能する理由は微妙です。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/"; 

ここで 2 番目に注意してくださいconst。これは、ポインターを再割り当てできないことを意味します。これにより、リンカー エラーが解決されます。

お役に立てれば!

于 2012-06-21T20:49:45.603 に答える