【问题标题】:Anonymous namespace to include a function in two cpp files在两个 cpp 文件中包含一个函数的匿名命名空间
【发布时间】:2013-11-06 15:31:08
【问题描述】:

我有一个函数应该包含在两个不同的翻译单元(即 cpp 文件)中,来自一个共同的标题。

我可能会使用匿名命名空间将此函数包含在两个 TU 中而不会发生冲突,但我想知道实现此目的的最佳方法是什么(静态?我不认为 global 可以工作,多个定义)

【问题讨论】:

  • 如果你想在头文件中添加函数的定义,那么使用inline是正确的方法。
  • 但这些都是长函数,有意义吗?
  • @DavidKernin:inline 与函数内联关系不大,因此函数的长度无关紧要。如果有帮助,请考虑将其命名错误。 inline保证了编译时函数内联所需的条件(即函数的定义在TU中可用),所以它的真正含义是表示一个函数,其定义在每个TU中都可用包括标题。编译器根据自己的启发式决定实际内联的内容,这可能取决于您是否将其标记为inline

标签: c++


【解决方案1】:

如果您希望它在每个 TU 中都具有相同的功能,请使用 inline。这正是inline 的用途:标头中定义的共享函数。

如果您希望它在每个 TU 中成为不同的功能,这是公认的不太可能的事件,请使用未命名的命名空间或 static。我不认为该标准给出了 C++ 中首选哪个标准的官方观点,但您会觉得它是未命名的命名空间。

您想要哪一个取决于您首先将函数定义放在头文件中的原因,以及您打算如何使用头文件。

【讨论】:

    【解决方案2】:

    你需要了解函数声明和它的定义之间的区别。除了模板和内联函数,只有函数声明应该在头文件中,函数定义应该在翻译单元中。

    void foobar( int ); // this is function declaration, now you can call this function
                        // you can put it on your sources as many times as you want
    
    void foobar( int param ) { // this is function definition, it should appear only once
       ...
    }
    

    【讨论】:

    • "except..." 和 static 非成员函数。以及无名命名空间中的函数。很多东西,真的:-)
    • @SteveJessop 我认为将static 非成员或无名命名空间函数放入标题中至少很奇怪。目的是什么?
    • 例如,它允许您将使用相同标头但具有影响函数定义的不同 -D 选项的不同 TU 链接在一起。在这种情况下,您不能使用 inline,因为不同的定义会违反 ODR。
    • @SteveJessop 是的,可能,但我会杀了我团队中试图在第一次代码审查时做这个废话的人。灾难之路。
    • 您的损失,但由于您负责样式指南,您可以设置任何您喜欢的规则。重点不是您想要通过#defines 设置不同的行为,而是您不想费心跟踪每个TU(可能包括编译为单独项目的库)是否使用是否相同的选项。
    【解决方案3】:

    如果您希望编译器将此函数视为每个 CU 中的不同函数,您可以将其定义包含在未命名的命名空间中。根据 C++ 2011 标准,在未命名命名空间中声明的实体具有内部链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 2011-03-21
      • 1970-01-01
      相关资源
      最近更新 更多