C/C++

Зачем программе нужен этот void? Если можно просто,ни чего,ни ставить тогда.

SA
Sul Ali
105
В языке C если ничего не стоит, значит там подразумевается int. При этом функция может ничего не возвращать, а может и вернуть целое число. Такое поведение изначально было заложено в язык - когда void в C ещё не было.

Потом появился C++ - в котором C немного причесали и явно разделили случаи "возвращаем необъявленный int" и "ничего не возвращаем" - добавив void. После чего void переехал из C++ в C.

И не стоит забывать про тип void* - для которого тоже нужно слово void.

P.S. В примере Def это абсолютно корректный прототип.

P.P.S. Если ты возьмёшь первое издание K&R (за много лет до C++) и сравнишь со вторым (современный C), увидишь несколько радикальных отличий в языке, вызванных заимствованием синтаксиса из C++.
МБ
Максим Белецкий
74 691
Лучший ответ
Для единообразия. Можно было бы написать транслятор так, что бы void был не нужен, но разработчики уже так придумали (неспроста, кстати), а вам, и всем, приходится подчиняться.
Чтобы знать что это именно void.
Например, чтобы разрулить неоднозначность в такой ситуации:

 #include  

my_function(); // Это прототип или вызов?

...

int main() {

...
Как-минимум, потому что методы с одинаковой сигнатурой повышают читабельность кода.
то что у Def это какой-то бред. Например для прототипа явно не хватает типа возврата и да это откомпилируется, но как минимум должно выдать ошибку warning: data definition has no type or storage class - это во-первых, а во-вторых: когда это у нас в Си стало возможным вызывать функции в глобал скоупе?

простой пример у нас есть файл a.c:

 int aaa(int a, int b) {
return a+b;
}
и файл main.c
 #include 

int aaa(int, int); // прототип

int main(void) {
printf("%d", aaa(2,5)); // вызов
return 0;
}
теперь компилим все это: gcc -std=c99 -Wall -Wextra -o main.exe main.c a.c
Все пройдет хорошо и вывалиться ексешник. При запуске даже ответ номальный. Но если убрать прототип или хотя бы возвращаемый тип то начнут валиться ошибки, а если оставить прототип и вместо двух поставить "a", то нас уже предупредят warning: passing argument 1 of 'aaa' makes integer from pointer without a cast

и
Дима Хорошенко
Дима Хорошенко
11 084