По крайней мере, в C и C ++ это не принесет никакого вреда. Аргументы передаются справа налево, и вызываемый абонент отвечает за очистку стека.
Однако компилятор не позволит вам сделать это, если вы не используете переменные параметры или не приводите тип функции. Например:
#include <stdio.h>
static void foo (int a, int b, int c, int d, int e, int f, int g)
{
printf ("A:%d B:%d C:%d D:%d E:%d F:%d G:%d \n",
a, b, c, d, e, f, g);
}
int main ()
{
typedef void (*bad_foo) (int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);
foo (1, 2, 3, 4, 5, 6, 7);
bad_foo f = (bad_foo) (&foo);
f (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17);
}
Если вы посмотрите на ассемблерный код, все параметры помещаются в регистр, но дополнительные значения просто игнорируются.