последствия вызова функции с меньшим количеством аргументов в C?

Я написал функцию, которая принимает некоторый аргумент и аргумент указателя. при вызове функции иногда мне нужно пройти вдоль указателя для использования внутри функции, а иногда нет. каковы последствия вызова функции с меньшим количеством аргументов? он компилируется правильно, и во время выполнения он все еще прекрасен, но это хорошее программирование? это лучше, если я вызываю функцию с фиктивной переменной? Спасибо и извините за вопрос начинающего.

Если вы вызываете функцию с слишком небольшим количеством аргументов и компилятор не жалуется, значит, вы делаете что-то неправильно.

Вы можете написать объявление / определение функции, которое не определяет, сколько аргументов оно требует:

void func(); /* ... */ func(); func(arg1); func(arg1, arg2); 

Все три этих вызова будут приняты компилятором, но по крайней мере два из них неверны.

Эта форма объявления / определения функции была устаревающей с 1989 года стандартом ANSI C.

Никогда не используйте эту форму.

Объявление функций должно всегда записываться как прототипы , т. Е. Объявления, определяющие количество и тип (ы) параметров. В качестве частного случая (void) обозначает функцию без параметров.

 void func(int arg); /* ... */ func(); /* rejected by compiler */ func(arg1); /* accepted -- but only if arg1 is of type int or convertible to int */ func(arg1, arg2); /* rejected by compiler */ 

Если вам удастся написать код, который вызывает функцию с неправильным числом аргументов и получить ее мимо компилятора, поведение не определено. Это может показаться «работающим», но оно может взорваться в вашем лице, когда, например, вы скомпилируете его с помощью другого компилятора или с тем же компилятором и разными параметрами.

Одно осложнение: некоторые функции являются переменными , принимая переменное количество аргументов. Наиболее распространенным примером этого является printf . Для вариационных функций требуемые аргументы обычно определяются документацией функции, и так же важно, чтобы аргументы были правильными. Разница в том, что для вариативных функций ваш компилятор не обязательно скажет вам, что вызов неверен.

Синтаксис , ... (в объявлении функции) и macros, определенные в являются единственным законным способом записи и использования C-функций, которые принимают переменные число и тип (ы) аргументов.

Одна из отличий C ++ от простой C заключается в том, что она включает в себя управление именами , что позволяет указать одну функцию с различными типами возвращаемых данных и параметрами. Две функции, которые имеют одно и то же имя, но имеют разные параметры:

 int foo(); int foo(int param1, char* param2); 

может быть выполнено в C ++, потому что оно фактически изменяет имя функций за кадром, когда оно скомпилирует его. Если вы хотите передать другое количество параметров, это по сути то же самое, что два имени функции, которые он вызывает:

 int foo1(); int foo2(int param1, char* param2); 

Когда вы передаете меньше параметров, чем ожидаете, некоторые компиляторы должны по крайней мере бросать предупреждения; другие вообще не будут компилировать программу.

Предположим, что вы передаете 2 параметра функции, которая ожидает 3. Когда вы попытаетесь ссылаться на этот третий параметр внутри вашей функции, что вы ожидаете от значения? В большинстве случаев это будет стоимость мусора, и определенно то, что ваша функция не ожидает.

Я бы предложил просто передать фиктивное значение таким функциям: NULL для указателя или 0 или отрицательный «неинициализированный» тип значения для других типов. Вы можете, по крайней мере, проверить эти значения в своей функции. Или просто напишите вторую функцию, которая принимает другое количество параметров.

Я бы этого не сделал. Я бы назвал функцию только объявленным количеством аргументов.

Это чрезвычайно запутанно для читателя кода.

Читатель кода может даже подумать, что функция перегружена и ищет другие определения функции с меньшим количеством аргументов.

Пропущенные аргументы могут иметь любое значение вообще – что-либо считается юридическим поведением компилятором C. Программа может отлично работать в тестовой среде, а затем сбой по любой причине или без причины.

Если бы я абсолютно должен был иметь переменное количество аргументов, для законной цели я попытался бы поместить аргументы в список вместо использования переменного количества аргументов. Если кто-то другой потребовал от меня использовать переменные аргументы, я бы использовал varargs вместо поведения по умолчанию, а затем только в том случае, когда все аргументы одного типа.