/dev/random писал: ↑13.05.2025 18:11
жучара писал(а): ↑13.05.2025 18:01
А вот этого всего: error: too many arguments to function нет.
Вы воспринимаете конструкцию "тип имя() {...}" в том смысле, который она имеет в C23 и всех версиях C++. В версиях C до C23 пустые скобки означают не отсутствие аргументов, а отсутствие прототипа, т.е. набор аргументов неизвестен, и компилятор должен догадываться при вызове. Чтобы показать отсутствие аргументов, нужно указать void, как вы это сделали в main.
это понятно, но дело ведь не ограничивается правилом- хочешь, чтобы параметров не было, пиши
void.
...Итак, файл
main.c. Тело функции, принимающей три параметра, отсутствует:
Код: Выделить всё
/* main.c */
#include <stdio.h>
void* foo (int x, int y, int z);
int main(void)
{
foo (1,2,3);
return 0;
}
Вот я сейчас если буду кропать исполняемый файл, надо чтобы была функция
foo тоже с тремя параметрами. У нас же не анархия. А я всё ж таки вот эту функцию ему подсуну, с двумя параметрами. И я уверен, что он ругнётся на стадии линковки- не подходят друг к другу функции:
Код: Выделить всё
/*foo.c*/
#include <stdio.h>
void* foo (int x, int y);
void* foo (int x, int y)
{
printf("Hello, world!\n");
}
Компилим, компонуем, выполняем (надеюсь. до последнего не дойдёт):
Shell
$ rm -f foo.o
$ rm -f main
$ gcc -o foo.o -c foo.c
$ gcc -o main foo.o main.c
$ ./main
Hello, world!
$
Получается, всё-таки анархия. Сколько хотим параметров, столько и передаём. Ужас.
Добавлено (22:51):
Мда. Короче, линковщик ничего не проверяет- ни количество параметров, ни тип. Только имя. Трэш просто лютый:
Код: Выделить всё
/* main.c */
#include <stdio.h>
//void* foo (char*, int, int, char*);
void* foo (char*);
int main(void)
{
// foo ("ddd",2,3, "klklkl");
foo ("ddd");
return 0;
}
Код: Выделить всё
/*foo.c*/
#include <stdio.h>
void* foo (int x, int y, int z);
void* foo (int x, int y, int z)
{
printf ("%d %d %d\n", x, y, z);
}
Shell
$ rm -f foo.o
$ rm -f main
$ gcc -o foo.o -c foo.c
$ gcc -o main foo.o main.c
$ ./main
-1550680050 -69020712 -69020696
$
...Ладно если в функция вызовется с большим количеством параметров, чем нужно, они просто полежат себе в стеке и всё, функция завершается, стек восстанавливается. Но если по ошибке будет положено параметров меньше, чем нужно, могут быть кранты как в данном случае- пойдёт обращение хз к каким адресам в стеке и неизвестно чем дело закончится и они могут быть изменены несанкционированно- то есть пострадает не адресное пространство функции foo а совсем другие данные, вне функции. Вот это может быть кошмар.
Я просто читаю маны.