【问题标题】:[C++]function template with static keyword[C++]带有static关键字的函数模板
【发布时间】:2010-12-03 18:29:12
【问题描述】:

来自 google 的 v8 js 引擎的代码,allocation.h:

 template <typename T>
 static void DeleteArray(T* array) {
  delete[] array;
}

这是一个函数模板(顶层,不在任何类中)。 但是 static 关键字是干什么用的呢?

【问题讨论】:

  • 它与标头中的普通、非模板化 static 函数执行相同的操作:stackoverflow.com/questions/780730/…
  • 因为它几乎肯定会成为一个内联函数,所以我会说'不是很多';)
  • static 在这种情况下已被弃用,取而代之的是匿名命名空间。
  • 我个人认为这是一个错误(因为它在头文件中)。它可能应该被标记为inline 而不是static。在这种情况下,内联让编译器知道在不同的编译单元中有一个函数的多个版本,因此它应该在链接时选择一个(如果有些实际上没有被物理内联)。
  • @Martin:如果是模板,则不需要inline。模板总是隐式内联的?

标签: c++ templates


【解决方案1】:

它是一个模板实际上是一个附带问题。

它是静态的意味着该函数在文件之外不可见(但由于它在头文件中,并且头文件实际上是包含它们的文件的一部分,这意味着在包含头文件的文件之外;并且每个文件包含标头实际上具有其自己的、相同但私有的函数版本)。

来自http://msdn.microsoft.com/en-us/library/s1sb61xd%28VS.80%29.aspx

"修改变量或函数时 在文件范围内,静态关键字 指定变量或 函数具有内部链接(其 从外面看不到名字 声明它的文件)。”

这里更详细地了解在头文件中包含它的含义:

C/C++: Static function in header file, what does it mean?

【讨论】:

  • private 在编译单元中不会公开符号名称以供链接器解析依赖关系。
【解决方案2】:

static 关键字给出了“内部链接”的定义,这意味着在不同的源文件中赋予名称 DeleteArray 另一个含义或不同定义是合法的。 (就像static void f();static int i; 的情况一样。)但我无法想象有人会想要这样做。

不推荐在 C++ 中以这种方式使用 static。如果没有 static 关键字,这个声明可能会更好,使其隐含 extern(仍然是 inline)。在这种情况下,链接器将被允许将来自多个对象的同一 T 的任何 DeleteArray&lt;T&gt;(T*) 定义组合在一起,因为它们是同一事物。

【讨论】:

    【解决方案3】:

    static 函数(在类之外)不能使用outside the defining file。这是没有命名空间的 C 的保留。我打赌你会发现 DeleteArray() 不是从另一个文件中调用的,除非它在另一个文件中被重新定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-05
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多