我之前遇到过以下问题,从那以后一直下意识地避免它,但一直没有完全理解它为什么会发生。有人可以向我解释以下内容有什么问题吗?
在头文件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' 的多个定义
时出现以下错误,即使头文件中有保护条件并且只出现一次问题定义。这似乎适用于我放在头文件中的任何指针,但不适用于普通常量,例如 ok
或 fine
。
如果我将 problem 更改为非常量:char* problem = "Problem"
我会收到有关已弃用转换的警告,但不会收到多个定义的警告,并且它会编译。
我正在使用 g++ 4.6.3 和 Code::Blocks 12.11
更新:
重新测试了 g++ 4.7.1(有和没有 Code::Blocks)并且不再有问题。关于那些建议使用 extern
或 static
的人,在这种情况下(您只需要一个简单的 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/