【问题标题】:Definition of constant within namespace in cpp filecpp文件中命名空间内常量的定义
【发布时间】:2014-09-02 02:37:58
【问题描述】:

我在 VS 2010 中处理了这种奇怪的(对我而言)效果。 请聪明的人解释一下。

//Header.h
#include <string>
namespace MySpace {
extern const std::string SOME_CONST_STRING;
}

//Implementation.cpp
#include "Header.h"
using namespace MySpace;
const std::string SOME_CONST_STRING = "CONST_STRING_VALUE";

这会导致链接器输出错误 LNK2001: unresolved external symbol const MySpace::SOME_CONST_STRING。

但是,当我像这样更改 Implementation.cpp 时:

//Implementation.cpp
#include "Header.h"
namespace MySpace {
const std::string SOME_CONST_STRING = "CONST_STRING_VALUE";    
}

代码构建正常。

在 cpp 文件中定义命名空间而不是使用它是一个很好的例子吗?

【问题讨论】:

  • 我不明白你的最后一个问题,恐怕。
  • cpp中的SOME_CONST_STRING也需要extern。
  • 两个版本的 Implementation.cpp 的唯一区别是使用命名空间 MySpace; vs 命名空间 MySpace { ... }。第一个链接失败,第二个链接正常。
  • 约瑟夫。我在“编码风格”问题中看到了它:在 cpp 文件中编写它的首选方式是什么:使用命名空间 MySpace; vs 命名空间 MySpace { ... }。很少有哪个例子比另一个更好。我在问上面的问题是否是不使用命名空间 MySpace 编写的充分理由;在实现 cpp 文件中?

标签: c++


【解决方案1】:

你也可以这样写:

const std::string MySpace::SOME_CONST_STRING = "CONST_STRING_VALUE";

该名称在 MySpace 中声明,因此您必须这样引用它。

【讨论】:

  • cpp中的SOME_CONST_STRING也需要extern。
  • @NeilKirk 它没有。事实上,它不能。
【解决方案2】:

您在使用时缺少“命名空间”。应该是这样的:

#include "Header.h"
using namespace MySpace;
const std::string SOME_CONST_STRING = "CONST_STRING_VALUE";

【讨论】:

  • 谢谢约翰,这只是问题中的“错字”。我会编辑它。
  • cpp中的SOME_CONST_STRING也需要extern。
  • 我也很确定你的代码不起作用。它怎么知道 SOME_CONST_STRING 是在 MySpace 中而不是在全局命名空间中?
  • 不,它没有,标题中的“extern”就足够了。那部分没问题。 ;)
  • 两个版本的 Implementation.cpp 的唯一区别是使用命名空间 MySpace; vs 命名空间 MySpace { ... }。第一个链接失败,第二个链接正常。
【解决方案3】:

命名空间的全部意义在于特定命名空间中的名称独立于该命名空间之外的名称。一个程序可以同时拥有一个MySpace::SOME_CONST_STRING 一个全局::SOME_CONST_STRING,这是两个完全不相关的符号。链接器使用一个定义来满足对另一个的引用是错误的。

当你定义一个变量时,你必须在你想要的命名空间中定义它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2013-06-12
    • 1970-01-01
    • 2011-12-18
    • 2013-03-20
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多