Вы объявляете специфические функции вашего модуля как статические? - PullRequest
10 голосов
/ 24 ноября 2008

Я думаю, что рекомендуется объявлять их как статические, так как это делает их невидимыми вне модуля.

Что вы думаете об этом?

Ответы [ 13 ]

26 голосов
/ 24 ноября 2008

Для C ++ лучше, чем статический, поместить его в безымянное (анонимное) пространство имен. Это предпочтительный способ предотвращения загрязнения глобального пространства имен.

namespace {
void myLocalFunction() {
// stuff
}
}
9 голосов
/ 24 ноября 2008

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

2 голосов
/ 20 декабря 2008

Согласовано. Как следствие, прототипы для статических функций должны находиться в начале файла .c, а не в файле .h.

2 голосов
/ 25 ноября 2008

В C я делаю все - функции и переменные - статичными в области видимости файла, пока не смогу продемонстрировать, что они необходимы вне файла. Я сделаю вещи статическими внутри функции, если только эта функция будет использовать их, и они не слишком велики. По сути, если объявление больше, чем остальная часть функции, я могу поместить объявление вне функции. И, конечно, есть заголовок для общедоступных сервисов, предоставляемых исходным файлом.

2 голосов
/ 24 ноября 2008

Многое было о деталях реализации и не слишком о концепции.

Ограничение области действия переменной / функции и т. Д. Действительно хорошая практика. Это базовая концепция объектно-ориентированного дизайна - вы хотите сохранить приватность как приватность. Таким образом, ваш интерфейс станет чище, а обслуживание кода станет проще. И вы не обнаружите, что однажды вы изменили что-то, что вы рассматривали как частную разоренную компиляцию, потому что кому-то в другой части проекта понравилась ваша функция и он решил ее использовать.

2 голосов
/ 24 ноября 2008

В C ++ вы должны использовать анонимное пространство имен, например:

// foo.cpp
namespace
{
   class Core { ... };
   void InternalFandango(Core *);
}

void SomeGloballyVisibleFunction()
{
   InternalFandango(&core);
}

Преимущество: это применимо и к объявлениям структуры / класса.
В C просто пометьте функции как «статические». Нет ничего против использования «static» в C ++, но я научился отдавать предпочтение пространству имен, поскольку это единое понятие, которое работает для всех объявлений.

1 голос
/ 26 ноября 2008

Если вы используете GCC, вам следует взглянуть на флаг видимости (см. http://gcc.gnu.org/wiki/Visibility для полного обсуждения).

Он будет полностью скрывать символы, а не помечать их как недоступные. Это уменьшает таблицу символов и помогает уменьшить время соединения.

Мало того, это открывает двери для большего встраивания, если вы к этому стремитесь.

1 голос
/ 25 ноября 2008

В C-коде сделайте ваши функции статичными по умолчанию. Создавайте нестатические функции и декларации .h только для функций, которые понадобятся другим модулям.

В коде C ++ поместите те функции, которые являются локальными для файла, в анонимное пространство имен , а сделает их статическими. По крайней мере, в компиляторе GNU это приведет к лучшему и наименьшему коду, потому что никакая функция не будет написана, если все использования встроены. Если вы хотите, чтобы он был встроенным, то, конечно, его пометка даже лучше, чем статическая.

Я не знаю, почему g ++ вообще записывает невостребованные тела функций, которые находятся в анонимных пространствах имен, но это так. Функции со скрытой видимостью, кажется, также обнаруживаются; помечены как скрытые символы, но все еще производят неиспользуемые блоки кода в объектном файле. GCC, вероятно, не понимает, что код не нужен в этих случаях. Или я что-то упускаю, всегда возможно.

1 голос
/ 24 ноября 2008

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

1 голос
/ 24 ноября 2008

О единственном потенциально полезном свойстве, которое я могу придумать для этого использования «static» в C ++, которое анонимные пространства имен не предоставляют, это то, что в GCC есть предупреждение, которое вы можете включить для неиспользуемых статических функций (форма мертвый код). Вы не получите этого для неиспользуемых функций в анонимных пространствах имен, поэтому в маловероятном случае, когда вы хотите, чтобы компилятор сообщал вам, когда вы прекращаете использовать функцию, делайте это так.

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