Прототипы функций C ++ - PullRequest
       36

Прототипы функций C ++

4 голосов
/ 06 декабря 2010

Я только начал изучать C ++. Могут ли некоторые объяснить разницу между следующими прототипами функций C ++?

void f(int n);
extern void f(int n);
static void f(int n);

Ответы [ 5 ]

11 голосов
/ 06 декабря 2010

Версии void и extern void одинаковы. Они указывают, что функция имеет внешнюю связь (то есть можно ожидать, что определение функции будет получено из какого-либо другого файла C или C ++). Статический указывает, что функция имеет внутреннюю связь и будет существовать только в текущем файле C ++.

Вы почти никогда не видите, чтобы эти спецификаторы применялись к функциям, потому что в 99,9% случаев требуется поведение по умолчанию extern.

Вы можете увидеть спецификаторы хранения static или extern в глобальных переменных, что часто делается для уменьшения конфликтов имен с другими файлами в том же проекте. Это пережиток С; если вы используете C ++, такого рода действия должны выполняться с использованием анонимного пространства имен вместо static.

4 голосов
/ 06 декабря 2010

Это больше вопрос языка C, чем вопроса C ++, но:

void f(int n);

Объявляет функцию f, которая принимает один целочисленный параметр.функция f, которая принимает один целочисленный параметр, но существует в каком-то другом файле.Компилятор будет доверять, что вы где-то реализовали функцию.Если компоновщик не может его найти, вы получите ошибку компоновщика.

static void f(int n);

Объявляет функцию f, которая принимает один целочисленный параметр.Ключевое слово static делает это интересным.Если это файл .cpp, функция будет видна только этому файлу.Если он находится в файле .h, каждый файл .cpp, содержащий этот заголовок, создаст собственную копию этой функции, доступную только для этого файла реализации.

3 голосов
/ 06 декабря 2010

Первые два - это одно и то же. Третий дает f внутреннюю связь, что означает, что другой исходный файл может использовать имя f, чтобы быть чем-то другим.

Использование static, как в этом третьем примере, не должно использоваться. Вместо этого используйте анонимное пространство имен:

namespace { // anonymous
  void f(int n);
}
0 голосов
/ 06 декабря 2010

Анонимное пространство имен - это более универсальное и более чистое решение, в нем могут быть функции, переменные, классы. И static слишком перегружен, в некоторых контекстах означает внутреннюю связь, в других - статическое время жизни.
Есть один недостаток анонимного пространства имен. Из-за внешних связей экспортированный раздел файлов вашего объекта / библиотеки будет заполнен всеми этими длинными <unique namespace name>::<function> именами, которых там не было бы, если бы они были статическими.

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

Оба ответа до сих пор не рекомендовали использовать статические функции.Зачем?Что делает

пространство имен {
void f (int n);
}

выше

static v (f n);

?Это не проще, это не легче понять ...

...