В дополнение к ответу caf:
Это не может работать из-за нескольких проблем, и стандарт не может сделать ничего, кроме как запретить такую вещь:
Прототипы сообщаютвызывающая сторона, как преобразования аргументов должны выполняться при вызове функции.Уже приведенный вами пример не будет надежно работать для первого параметра.Вы объявляете это void*
, а затем int
в другом.Поскольку оба могут иметь разную ширину, ваш код обречен на сбой на большинстве 64-битных архитектур.
Еще хуже, нотация ...
говорит вызывающей стороне применять продвижение по умолчанию для оставшихся аргументов.Например, если ваша реализация ожидает float
, вызывающая сторона всегда будет предоставлять double
, и, опять же, ваш код будет аварийно завершать работу (= в последнее время).
Тогда современные архитектуры имеют сложные правила, тип которыхаргументы, которые они помещают в стек и которые хранятся в регистрах.Это зависит от типа аргумента, например, целые числа и числа с плавающей запятой имеют разные наборы регистров.Так что это сделает ваши аргументы совершенно неверными.