Как реализовать “частную/ограниченную” функцию в C?

Я рассмотрел бы упрощение Вашего веб-приложения путем включения Elmah.

Вы добавляете блок Elmah к своему проекту и затем настраиваете Ваш web.config. Это затем зарегистрирует исключения, созданные на уровне страницы или контроллере. Это может быть настроено для входа к всевозможным местам (как SQL Server, электронная почта и т.д.). Это также обеспечивает сеть frontend, так, чтобы можно было просмотреть журнал исключений.

первая вещь я добавляю к любому asp.net mvc приложение, которое я создаю.

я все еще использую log4net, но я склонен использовать его для входа отладки/информации и оставлять все исключения Elmah.

можно ли также найти больше информации в вопросе , Как Вы регистрируете ошибки (Исключения) в Ваших приложениях ASP.NET? .

28
задан Walt W 9 September 2009 в 20:07
поделиться

6 ответов

Вот один способ:

int f_real_name(void)
{
    ...
}

#define f f_real_name
int g(void)
{
    // call f()
}
#undef f

// calling f() now won't work

Другой способ, если вы можете гарантировать, что f () и g () - единственные функции в файл, состоит в том, чтобы объявить f () как static .

РЕДАКТИРОВАТЬ: Еще один трюк с макросами, вызывающий ошибки компилятора:

static int f(void) // static works for other files
{
    ...
}

int g(void)
{
    // call f()
}
#define f call function

// f() certainly produces compiler errors here
39
ответ дан 28 November 2019 в 02:22
поделиться

Поместите g () и f () в один и тот же модуль и объявите f () статическим. Ключевое слово static делает f () доступным только для функций в том же модуле или исходном файле.

Вы также можете упомянуть, что никакие другие методы не должны быть разрешены в модуле с f () и g (), иначе они можно было бы вызвать f ().

PS - Я действительно думаю, что ответ Криса Лутца на самом деле лучший. В нем упоминается этот подход, но также упоминается умное переименование макроса, которое работает с меньшим количеством условий окружающей среды (не требует файла модуля специально для этих двух функций).

Также обратите внимание, что с помощью макроса вы можете сделать следующее:

#define f() f_should_not_be_called_by_anything_except_g

В результате появилось бы красивое сообщение об ошибке, а программы автозаполнения (например, Visual Studio) покажут этот совет, когда пользователь наберет f ().

27
ответ дан 28 November 2019 в 02:22
поделиться

You может создавать частные для модуля функции с ключевым словом static :

static void func(void)
{
    // ...
}

Тогда func () может вызываться только другими функциями, определенными в том же файле (технически то же самое ] единица трансляции : другие функции, определения которых включены в директиву #include , все еще могут получить к ней доступ). func , как говорят, имеет внутреннюю связь . Все остальные функции (то есть без ключевого слова static ) имеют внешнюю связь.

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

11
ответ дан 28 November 2019 в 02:22
поделиться

Поместите f () и g () в один исходный файл, объявите f () static.

]
8
ответ дан 28 November 2019 в 02:22
поделиться

Для GCC можно использовать вложенных функций . Хотя это не стандартный C, он работает довольно хорошо.

8
ответ дан 28 November 2019 в 02:22
поделиться

Это возможно только по совпадению.

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

Если другие функции должны появляться в том же исходном файле, поместите f () в конец файла как статический функция

3
ответ дан 28 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: