【问题标题】:C++ Does inlining a namespace implicitly inline its functions?C ++内联命名空间是否隐式内联其功能?
【发布时间】:2020-05-16 08:07:27
【问题描述】:

如果我有一个标题:

namespace outer {
    inline namespace inner {
        void func();
    }
}

然后我无法在单独的 .cpp 文件中定义 func(),因为这会给我一个编译错误:

- undefined reference to 'outer::inner::func()'

就像我声明了内联函数一样。它是否正确?这是否意味着内联命名空间隐式内联其功能。我尝试查看https://en.cppreference.com/w/cpp/language/namespace,但找不到任何明确说明的地方。

编辑 2: 无视,之前的编辑。我未能正确配置我的 cmake 文件,因此无法编译代码。请参阅答案以获取原始问题的答案。谢谢大家!

编辑:

这是一个我无法编译的例子:

测试.h

namespace Core {
    inline namespace TestNameSpace {
        void write();
    }
}

Test.cpp

#include <iostream>
#include "Test.h"

void Core::write() {
    std::cout << "BAJS\n";
}

main.cpp

#include "Test.h"
int main() {
    Core::write();
    return 0;
}

我应该注意,#include "Test.h" 在我的 IDE 中的 Test.cpp 文件中显示为灰色。

【问题讨论】:

  • 我认为问题在于你的编译方式。
  • 好的,那么上面的例子理论上应该可行吗?我还有其他问题,对吗?
  • 无法重现:godbolt.org/z/N7fDhz
  • 添加编辑示例。
  • 但编译器输出与函数不匹配?这里可能有一个很好的问题 - 需要再次编辑。

标签: c++ namespaces inline


【解决方案1】:

简单的答案是:不。您完全可以在单独的 cpp 文件中定义函数。命名空间上的inline 基本上使您无需指定命名空间名称。例如,您可以使用outer::func() 而不是outer::inner::func()

[namespace.def]/5-7。对于必须在哪里定义函数没有任何限制,并且它隐式地内联它们。

您遇到的错误在于您的编译方式。您可能忘记编译 .cpp 文件,或者至少将其链接到调用它的位置。

【讨论】:

  • 您知道何时添加了将命名空间声明为inline 的可能性吗?在我最喜欢的 c++ 参考资料中,我找不到一个关于内联命名空间的词
  • @foreknownas_463035818 从 C++11 开始。如果参考文献没有提到它,那就太令人惊讶了。
  • 呃,这都是我的错,当我应该咨询this 时,我正在阅读here
  • @foreknownas_463035818 是的,对于命名空间,它并不是真正的说明符,因此它不属于“内联说明符”页面。真的inline 命名空间与inline 说明符中inline 的含义完全没有关系。我猜他们只是想重用一个关键字而不是引入一个新关键字。
  • 谢谢!它没有在我的项目中编译的原因是我忘记正确配置我的 cmake 文件。
猜你喜欢
  • 2012-06-16
  • 2020-09-29
  • 2016-06-19
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多