头文件中的常量指针

时间:2013-05-11 09:40:57

标签: c++ pointers const header-files

我以前遇到过以下问题,并且从那时起就已经下意识地避开它,但却从未完全理解为什么会发生这种情况。有人可以向我解释下列内容有什么问题吗?

在标头文件Library.h

#ifndef LIBRARY_H
#define LIBRARY_H

#include <string>

const char ok = 'K';

const char* problem = "Problem";
const std::string fine = "Fine";

#endif 

在包含主文件main.cpp

#include "Library.h"

using namespace std;

int main()
{
    return 0;
}

编译multiple definition of 'problem'时出现以下错误,即使头文件中有保护条件且只有一次出现问题定义。这似乎适用于我在头文件中放置的任何指针,但不适用于okfine等常规常量。

如果我将问题更改为非常量:char* problem = "Problem"我会收到有关已弃用转化的警告,但不会收到多个定义的警告。

我正在使用g ++ 4.6.3和Code :: Blocks 12.11

更新 已经重新测试了g ++ 4.7.1(有和没有Code :: Blocks)并且不再出现问题。关于那些建议使用externstatic的人是否有任何其他理由在这样的情况下使用它们(你只想要一个简单的c-string常量),而不是与旧编译器的可兼容性?

1 个答案:

答案 0 :(得分:2)

这里的“问题”是每次包含标题时都不保证字符串"Problem"是相同的。

您可以使用static

解决此问题
static const char* problem = "Problem";

但是,如果您希望在多个源文件中看到SAME变量problem,那么它们也无法正常工作。在这种情况下,您需要这样做:

extern const char* problem;

然后在library.cpp或其中一些:

const char* problem = "Problem";