# 9. Non-void функции

{% file src="<https://4112636200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKMqUSFKgvT06FCJhm51b%2Fuploads%2Fgit-blob-e6bb5174d532a1d487f5b58ac8dc2bca100b7408%2F.clang-format?alt=media>" %}
Весь приведённый далее код оформлен с использованием clang-format
{% endfile %}

{% code overflow="wrap" lineNumbers="true" %}

```c
#include <stdio.h>

int foo()
{
    printf("in foo()\n");
    // do smth
}

int main(void)
{
    foo();
    // do smth
}
```

{% endcode %}

<details>

<summary>Вариант реорганизации и исправления кода</summary>

Здесь `void` относится и к возвращаемому значению функции, и к указанию типа `void` в аргументах функции.

`void` в аргументах функции показывает, что данная функция не принимает аргументов. В C до C23 `int foo()` – функция, которая принимает неопределенное количество параметров (если они не используются в определении функции).

Во-вторых, функция `foo` имеет тип возвращаемого значения `int`, однако в оригинальной версии кода там не было `return`. Соответственно код продолжит исполняться дальше и в какой-то момент программа упадёт.

Также:

Executing the return statement in a no-return function is undefined behavior. (since C11)

{% code overflow="wrap" lineNumbers="true" %}

```c
#include <stdio.h>

int foo(void)
{
    printf("in foo()\n");
    // do smth
    return 0;
}

int main(void)
{
    foo();
    // do smth
    // good practice
    return 0;
}
```

{% endcode %}

</details>
