1

我以前遇到过以下问题,从那以后一直在下意识地避免它,但从未完全理解它为什么会发生。有人可以向我解释以下有什么问题吗?

在头文件中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'即使头文件中有保护条件并且仅出现一次问题定义,编译时也会出现以下错误。这似乎适用于我放在头文件中的任何指针,但不适用于普通常量,例如okor fine

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

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

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

4

1 回答 1

2

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

你可以通过使用解决这个问题static

static const char* problem = "Problem";

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

extern const char* problem;

然后在library.cpp或一些这样的:

const char* problem = "Problem";
于 2013-05-11T09:48:24.373 回答