Зачем использовать статические функции в C? - PullRequest
1 голос
/ 23 сентября 2019

Я читал о статических функциях в C в этой теме: https://stackoverflow.com/a/558201/7997108

Как я понял, в основном, где вы определяете статические функции, это единственное "место" / файл (то есть fileA.c)где вы можете вызвать его, что делает эту функцию "приватной" для этого файла .c или .h (или модуля перевода).Но если вы #include этот файл в другой файл (fileB.c), вы все равно сможете использовать его там?

Так что я пытаюсь понять, в каком случае вы хотите, чтобы функция была статической по отношению к еесобственный .c и как это имеет смысл, если вы все еще можете использовать эту "приватную" / статическую функцию, просто включив файл, в котором она определена.

Также, как я понимаю, на случай, если вы не включите какую-то другуюфайл, в котором определена какая-то функция, которую вы не сможете использовать / вызывать в любом случае, верно?

Другими словами, я просто не могу понять, каков типичный сценарий использования статических функций и чем он отличается от нестатической функции в принципе.

Ответы [ 2 ]

5 голосов
/ 23 сентября 2019

Представьте, что вы кодируете библиотеку, и вам нужно определить небольшую вспомогательную функцию.Возможно, вы назовете эту функцию test:

int test(int x)
{
    return x > 100;
}

Эта функция не является частью открытого интерфейса, поэтому вы оставляете ее скрытой в файле .c.И все хорошо, верно?

Неверно.

Проблема № 1: Любой может использовать эту функцию, просто добавив эту декларацию в свой код:

int test(int);

Проблема № 2: Представьте, если другая библиотека имеет свою вспомогательную функцию test.Если эта библиотека и ваша библиотека использовались в одной и той же программе, компоновщик выдаст ошибку, потому что две функции не могут иметь одинаковое имя.

Решение - использовать staticstatic функции являются уникальными для их единицы перевода и не предоставляются глобально.

1 голос
/ 23 сентября 2019

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

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