Сделать функцию доступной только из одной другой функции - PullRequest
0 голосов
/ 16 июня 2009

Как я могу объявить и определить функцию, чтобы она была доступна только из одной функции? Я могу объявить функцию в другой функции. Но поскольку определения локальных функций недопустимы (согласно Visual C ++), я должен определить функцию в глобальной области видимости, чтобы другие функции могли вызывать ее.

void f1() {
    void f1_private();
    f1priv();
}

void f1_private() {
}

void f2() {
    f1_private(); // Legal
}

Можно ли сделать f1_private доступным только из f1? Если нет, то для чего используются локально объявленные функции?

Ответы [ 6 ]

8 голосов
/ 16 июня 2009

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

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

8 голосов
/ 16 июня 2009

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

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

3 голосов
/ 16 июня 2009

номер

Но вы можете написать на C ++, объявить метод внутри класса, сделать метод приватным и сделать другого друга другом первого класса.

1 голос
/ 16 июня 2009

Оставить комментарий.

//For use only by foo.

Если кто-то действительно любит его использовать, он найдет способ, несмотря на все ваши усилия. Даже если это означает просто копирование и вставку кода или рефакторинг кода. Лучше всего сделать так, чтобы они знали, что не должны.

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

0 голосов
/ 16 июня 2009

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

0 голосов
/ 16 июня 2009

// внизу вашего .c файла

static void foo()
{
}

void dude()
{
    // foo only accessible here, unless you have forward
    // declared it higher up in the file
    foo();
}

Однако обратите внимание, что даже статические методы можно вызывать вне области видимости файла через указатель на функцию.

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