Шаблон функции [C ++] со статическим ключевым словом - PullRequest
2 голосов
/ 03 декабря 2010

код из движка Google v8 js, alloc.h:

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

Это шаблон функции (верхнего уровня, не в любом классе).Но для чего используется ключевое слово static?

Ответы [ 3 ]

2 голосов
/ 03 декабря 2010

То, что это шаблон, на самом деле является побочной проблемой.

Это статическое состояние означает, что функция не видна за пределами файла (но поскольку она находится в заголовке, а заголовки фактически являются частью файлов, которые включаютих, это означает, что вне файла, который включает в себя заголовок, и каждый файл, который включает в себя заголовок, фактически имеет свою собственную, идентичную, но частную версию функции).

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

"При изменении переменной или функции в области действия файла ключевое слово static указывает, что переменная или функция имеет внутреннюю связь (ее имя не видно снаружи файла, в котором она объявлена)."

Посмотрите здесь больше о том, что значит иметь это в заголовочном файле:

C / C ++: Статическая функция в заголовочном файле, что это значит?

1 голос
/ 03 декабря 2010

Ключевое слово static дает определение "внутренняя связь", что означает, что было бы законно присвоить имени DeleteArray другое значение или другое определение в другом исходном файле.(Как и в случае с static void f(); или static int i;.) Но я не могу себе представить, что кто-то захочет это сделать.

Использование static таким способом в C ++ не рекомендуется.Это объявление, вероятно, было бы лучше без ключевого слова static, делая его неявно extern (и все же inline).В этом случае компоновщику будет разрешено объединить любые определения DeleteArray<T>(T*) для одного и того же T из нескольких объектов, поскольку они будут одним и тем же.

0 голосов
/ 03 декабря 2010

static функции (вне класса) нельзя использовать вне определяющего файла .Это удержание от C, где нет пространств имен.Могу поспорить, вы обнаружите, что DeleteArray() не вызывается из другого файла, если только он не был переопределен в этом другом файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...