【问题标题】:extern constant, unnamed namespace外部常量,未命名的命名空间
【发布时间】:2017-01-23 20:45:55
【问题描述】:

我有一个项目需要“使用未命名的命名空间创建一个常量变量”,我需要与另一个 .cpp 文件中的函数共享它。它说变量声明可以在他们自己的文件中。提到了 extern 关键字的使用,我想出了如何使用 extern,将 var 放在头文件中并声明 like extern const char varname;,在我的 main.cpp 中为其分配了一个值,(const char varname = A; 全局高于 main 函数)并且能够在另一个 .cpp 文件中使用它。但我不确定如何使用未命名的命名空间。在示例文件中,它们在主文件中有以下内容:

namespace
{
  extern const double time = 2.0;
}

但是现在有一个如何在另一个 .cpp 文件中访问它的示例。我尝试使用我的变量执行此操作,但在尝试使用它的另一个文件中出现错误,说它未在该范围内声明。

有人可以提供一些关于我应该在这里做什么来利用这两个东西的见解吗?

【问题讨论】:

  • 我不认为你理解你的任务。使用未命名命名空间的关键在于,其中定义的函数和变量对于其他 .cpp 文件(或者,使用正确的术语,翻译单元)是可见的。
  • 所述的分配似乎在术语上是矛盾的。未命名命名空间中的项目不能按名称与任何其他翻译单元共享。我想您可以在originalfile.cpp 代码中通过#include "otherfile.cpp" 与另一个文件“共享”,但这确实是作弊。
  • 嗯。好吧,它说使用未命名的命名空间声明常量,我必须与其他函数共享它,并且它不能通过引用传递。它特别建议使用extern。所以是的,我不确定它想要什么。
  • externunnamed namespace 不能真正一起使用,因为命名空间在该翻译单元中创建了一个唯一的命名空间,导致 extern 变量在另一个翻译单元中无法找到。您可以将常量放在头文件的未命名命名空间中,但从链接器的角度来看,从技术上讲,它是两个具有相同值的不同常量,而不是共享常量。

标签: c++ c++11


【解决方案1】:

您可以尝试编写如下访问器函数:

ma​​in.cpp

#include "other.hpp"

namespace
{
    const double time = 2.0;
}

int main()
{
    tellTime();
    return 0;
}

const double getTime()
{
    return time;
}

other.hpp

#ifndef OTHER_HPP_INCLUDED
#define OTHER_HPP_INCLUDED

const double getTime();
void tellTime();

#endif // OTHER_HPP_INCLUDED

其他.cpp

#include <iostream>
#include "other.hpp"

void tellTime()
{
    std::cout << "Time from the anonymous namespace of main.cpp is " << getTime() << std::endl;
}

我认为任何数量的 extern 都无济于事:https://stackoverflow.com/a/35290352/1356754

【讨论】:

  • 如果将getTime()函数声明包含在头文件中,则不需要在main.cpp中转发声明。它是合法的 c++,但它是代码重复,通常应该避免。
【解决方案2】:

您可以通过对变量的其他引用访问使用它。

例如:

namespace
{
  const double time = 2.0;
  const double & local_ref_time(time); //Create a local referece to be used in this module
}


extern const double & global_ref_time(local_ref_time); //Create the global reference to be use from any other modules

【讨论】:

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