c – 全局const char上的错误LNK1169 *

前端之家收集整理的这篇文章主要介绍了c – 全局const char上的错误LNK1169 *前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在使用Visual Studio 2010和C时遇到了一些奇怪的行为.
我有一个头文件,我在其中声明了一些全局常量
#ifndef CONSTANTS_H
#define CONSTANTS_H

#define WIN32_LEAN_AND_MEAN

// Macros...
#define SAFE_RELEASE(ptr) { if (ptr) { ptr->Release(); ptr = NULL } }
#define SAFE_DELETE(ptr) { if (ptr) { delete ptr; ptr = NULL; } }

// Constants...
const char* CLASS_NAME = "WinMain";
const char GAME_TITLE[] = "DirectX Window";

const int GAME_WIDTH = 640;
const int GAME_HEIGHT = 480;

#endif

我的问题来自以下行:

const char* CLASS_NAME = "WinMain";

当它是这样的,我构建我的解决方案时,我得到以下2个错误

错误LNK1169:找到一个或多个多重定义的符号,和

错误LNK2005:“char const * const CLASS_NAME”(?CLASS_NAME @@ 3PBDB)已在graphics.obj中定义

现在很奇怪,因为运行’在文件中查找’,我绝对不会在其他地方声明它,即没有重复的声明.

我应该把它改成:

const char* const CLASS_NAME = "WinMain";

要么

const char CLASS_NAME[] = "WinMain";

它编译得很好!但据我所知,char * x相当于char x [],而且我在指针和指向值上强制执行’const-ness’这一事实应该没有区别……或者是它?

我对Windows平台上的C开发有点新,所以任何帮助都将不胜感激!

解决方法

你错了是你没有将常量声明为常量.在C语法(以及C语言)中,为了声明一个常量指针,你必须这样做
const char* const CLASS_NAME = "WinMain";

请注意,您的GAME_TITLE,GAME_WIDTH和GAME_HEIGHT已正确声明为常量,这就是为什么它们不会给您带来任何麻烦.只有CLASS_NAME声明不正确,即非常量.

默认情况下,C中的常量具有内部链接,这就是为什么您可以在头文件中定义它们而不违反一个定义规则.

猜你在找的C&C++相关文章