c++ - 头文件中的常量指针

标签 c++ pointers constants 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;
}

在编译 'problem' 的多个定义 时出现以下错误,即使头文件中有保护条件并且只出现一次问题定义。这似乎适用于我放在头文件中的任何指针,但不适用于普通常量,例如 okfine

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

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

更新: 重新测试了 g++ 4.7.1(有和没有 Code::Blocks)并且不再有问题。关于那些建议使用 externstatic 的人,在这种情况下(您只需要一个简单的 c 字符串常量)还有其他理由使用它们吗?比与旧编译器的兼容性?

最佳答案

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

您可以使用 static

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

但是,如果您希望在多个源文件中看到相同的变量问题,那也行不通。在这种情况下,您需要这样做:

extern const char* problem;

然后在 library.cpp 或类似的文件中:

const char* problem = "Problem";

关于c++ - 头文件中的常量指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16495762/

相关文章:

Const 不就是 const 吗?

c++ - 如何在派生类的函数中使用基类的静态常量字段作为数组的大小?

c++ - 断言语句无法正常运行?

c++ - 非数据类型模板参数,生成更多特化?

c++ - 如何在 C++ 中将空格分隔的字符串拆分为多个字符串?

java - 为什么大括号后不需要分号?

c - 访问从 void 指针转换的结构中的 char 指针

c - 真实分配 : invalid next size while splitting a line

c++ - C++ 中成员函数的 const& 、 & 和 && 说明符

c++ - 从 C++ 中的 const 成员函数修改引用成员