Использование (очевидно) пустой функции C

Может ли кто-нибудь прокомментировать точку следующей функции, которая, похоже, не очень много делает:

// Returns stored values
int getDetails(const int param1[],
               int* param2,
               int* param3,
               int* param4)
{
    (void)param1;
    (void)param2;
    (void)param3;
    (void)param4;
    return 0;
}

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

Моя лучшая догадка на данный момент заключается в том, что функция устарела, но не удалена, а (void)param предназначен для того, чтобы избежать предупреждений компилятора о неиспользуемых переменных.


person Component 10    schedule 10.04.2013    source источник


Ответы (5)


Такие операторы, как (void)param1;, обычно используются для подавления предупреждений о неиспользуемых параметрах функции. (Кроме того, в C++ вы также можете закомментировать или удалить имена параметров.)

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

person simonc    schedule 10.04.2013
comment
опускание имен параметров в прототипах, которые являются частью определения, является C++-измом. - person Christoph; 10.04.2013

Это пустая функция. Приведения к void подавляют предупреждения о неиспользуемых параметрах.

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

У меня есть несколько таких функций в генераторе кода моего компилятора. На самом деле есть два генератора кода, один для x86, а другой для MIPS. Я компилирую и связываю то одно, то другое, а не то и другое одновременно.

Генераторы кода отличаются внутри, но имеют одинаковый внешний API. Таким образом, некоторые функции, специфичные для одного ЦП, должны выполнять некоторую работу, в то время как те же функции для другого не имеют никакого отношения. Логично, что некоторые из них пусты, так как там нечего делать.

person Alexey Frunze    schedule 10.04.2013

Мое предположение (мнение - извините!), что это может быть заглушка, как вы говорите. Если у вас есть функция, которая принимает один или несколько указателей на функции для достижения чего-то и не допускает NULL (не беспокойтесь об этом), тогда вы должны предоставить что-то для ее вызова.

Приведения, вероятно, предназначены для того, чтобы избежать предупреждения о «неиспользуемом параметре».

person LoztInSpace    schedule 10.04.2013

Вы правы, это не имеет смысла.

Все, что он делает, это явно игнорирует аргументы, оценивая их и приводя результат к (void), и возвращая 0.

Используется ли возвращаемое значение в контексте вызова? Наилучший подход, конечно, состоит в том, чтобы удалить вызов и заменить его на 0, если используется возвращаемое значение, и протестировать программу.

person unwind    schedule 10.04.2013
comment
Вы, вероятно, правы, но из-за (отсутствия) контекста мы не можем быть уверены, что это не имеет смысла. Например, это может быть функция остановки в списке указателей на функции. Что-то вроде if (0==p(param1, param2, param3, param4)) прекрати делать вещи. - person Prof. Falken; 10.04.2013
comment
Контекст, безусловно, является ключевым здесь. С моего привилегированного положения, когда я могу видеть остальную часть кода, я вижу, что, к счастью, указатели на функции здесь не используются, поэтому их можно безопасно удалить. Урок, который я извлек из этого, заключается в том, что важно комментировать контекст и цель изменения, чтобы будущие читатели понимали назначение кода. Это старая пословица, но ее стоит повторить: если бы я получал по фунту за каждый раз, когда я это говорю, мне бы больше не приходилось исправлять чужой код! :-) - person Component 10; 10.04.2013

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

person user2247801    schedule 10.04.2013