Когда можно использовать void() и каковы преимущества этого

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


person Dillon Chaffey    schedule 23.03.2011    source источник
comment
Нет функции с именем void. Можете ли вы рассказать нам, что именно вы видели, на примере?   -  person Jon    schedule 23.03.2011


Ответы (4)


Не существует функции с именем void, но функция может быть объявлена ​​с возвращаемым типом void. Это означает, что функция не возвращает значение.

void DoSomething(...)
{
  ....
}

Обновить

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

float CalculatePi(void)
{
 ....
}
person Andrew Cooper    schedule 23.03.2011
comment
Виноват. Я хотел сказать: должен ли void вместо аргументов функции делать что-то особенное? Он просто сообщает компилятору, что для этой функции нет конкретного аргумента? - person Dillon Chaffey; 23.03.2011
comment
В C89 f(void) означает, что функция не принимает аргументов, а f() означает, что для аргументов не выполняется проверка типов. - person dan04; 23.03.2011

void в C имеет три применения:

  1. Чтобы объявить, что функция не возвращает значение:

    void foo(int x);
    
  2. Чтобы объявить, что функция не принимает параметры:

    int baz(void);
    
  3. (ОПАСНО БУДЕТ РОБИНСОН!) Чтобы объявить «универсальный указатель», который можно передать, например. волшебное печенье или передается кому-то в обратном вызове, чтобы вернуться к исходному типу.

    int register_callback(void (*foo)(void *baz), void *bar);
    

register_callback вызывается с указателем на функцию void, которая ожидает в качестве параметра указатель, который предположительно что-то для нее значит. В некоторый (неопределенное) время в будущем эта функция будет вызвана с bar в качестве параметра. Вы можете увидеть подобные вещи в определенных видах встроенных исполнительных устройств и многоразовых драйверов устройств, хотя и не так часто.

person John R. Strohm    schedule 23.03.2011
comment
четвертое: приведение выражения (вызов функции или что-то вроде этого), чтобы отбросить его значение и оценить только его побочные эффекты. - person Jens Gustedt; 23.03.2011
comment
пункт № 3 касается void*, а не void. Это 2 очень разные вещи. - person pmg; 23.03.2011
comment
@Jens: Вы можете использовать это таким образом, но я никогда не видел, чтобы кто-то беспокоился. Когда вы в последний раз делали (void)printf(...)? - person John R. Strohm; 23.03.2011
comment
@John, вы используете это, например, если выражение имеет квалификатор volatile и вы хотите успокоить компилятор. В моих макросах также есть кое-что, что часто бывает удобно, P99_NOP, которое расширяется до (void)0. Например, если вы хотите объявить макрос с несколькими операторами, включая break, вы можете сделать if (1) { .... } else P99_NOP вместо обычно используемого do { ... } while(0). - person Jens Gustedt; 23.03.2011
comment
@Jens, обычно я не верю в успокоение компилятора. Обычно он гораздо умнее меня в таких вещах и рассказывает мне то, о чем я действительно хочу знать. (По крайней мере, таков был мой опыт за последние 30 лет или около того...) - person John R. Strohm; 23.03.2011
comment
@John, в компиляторе нет смысла, чтобы выражение не имело эффекта, когда я помещал его просто так, чтобы оно не имело никакого эффекта. В любом случае, это допустимое использование void, упомянутое в стандарте как таковое. Поскольку вы утверждаете общее утверждение о C, оно отсутствовало. Вот и все. - person Jens Gustedt; 23.03.2011

Когда полезно использовать void в качестве аргументов функции?

#include "stdlib.h"
#include "stdio.h"

void foo();

int main()
{
    foo(5);    // Passing 5 though foo has no arguments. Still it's valid.
    return 0;
}

void foo()
{
    printf("\n In foo \n") ;
}

В приведенном выше фрагменте, хотя прототип foo() не имеет аргументов, он по-прежнему допустим для передачи ему чего-либо. Так вот, чтобы таких вещей не случилось -

void foo(void) ;

Теперь гарантируется, что передача чего-либо в foo() вызовет ошибки компилятора.

person Mahesh    schedule 23.03.2011
comment
@Dillion Один из ваших комментариев имел в виду, когда void в качестве аргумента функции полезен. Итак, выложил этот фрагмент. - person Mahesh; 23.03.2011
comment
Вызов foo(5) НЕДЕЙСТВИТЕЛЬНЫЙ, т.е. вызывает UB. Чтобы быть действительным, его нужно было бы вызывать без параметров в соответствии с определением функции (не объявлением). Компилятор использует объявление, чтобы узнать о типе возвращаемого значения (и проверить аргументы): в приведенной выше программе проверка аргументов не выполняется, но аргументы в любом случае должны соответствовать определению функции. - person pmg; 23.03.2011
comment
Правильная идентификация заголовков — <stdlib.h> и <stdio.h> (обратите внимание, что вы не используете в своей программе ничего, объявленного в <stdlib.h>). - person pmg; 23.03.2011

Я не думаю, что есть функция void().

Однако ключевое слово void используется для обозначения того, что функция ничего не возвращает, например:

void MyFunction() {
   // function body here
}
person Meta    schedule 23.03.2011