【问题标题】:C++ namespace function definition only has static keywordC++ 命名空间函数定义只有 static 关键字
【发布时间】:2022-07-21 23:42:46
【问题描述】:

我了解静态命名空间函数可以声明为静态的,并且在函数定义中省略了 static 关键字。我所拥有的是相反的,例如:

// in foo.h
namespace Foo
{
    void bar();
}

// in foo.cpp
static void Foo::bar()
{
}

static 关键字在这里有什么作用,还是被忽略了?它可以编译任何一种方式,并且这些功能可用于其他翻译单元。

【问题讨论】:

  • 在我的系统上,我得到error: static declaration of 'bar' follows non-static declaration
  • 您使用什么编译器和版本来编译该代码?
  • static 在此上下文中意味着:此符号仅在当前翻译单元中可见。所以如果它编译,当符号用于不同的翻译单元时会导致链接问题。
  • clang、gcc 和 MSVC 都拒绝此代码:godbolt.org/z/nY4c7fsqs。它可能编译的唯一方法是foo.h 不包含在foo.cpp

标签: c++ static


【解决方案1】:

dcl.stc 可以看出,给定的程序无效,其中指出:

给定实体的连续声明所暗示的链接应一致。也就是说,在给定的范围内,每个声明相同的变量名或函数名的相同重载的声明都应暗示相同的链接。

(结束引用)

现在,让我们将其应用到您的示例中。

// in foo.h
namespace Foo
{
    void bar(); //#1 external linkage
}

// in foo.cpp
static void Foo::bar()  //#2 tried to give Foo::bar internal linkage 
{
}

在上面的代码中,bar 的第一个声明 #1 给出了它外部链接,而在 #2 的源文件 (foo.cpp) 中实现它时,你是试图给它内部链接。所以根据上面引用的陈述,给定的例子是无效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 2012-11-08
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多