Значения по умолчанию на аргументах в функциях C и перегрузке функции в C

При преобразовании lib C++ в ANSI C и это походит, хотя ANSI C не поддерживает значения по умолчанию для функциональных переменных, или действительно ли я ошибаюсь? То, что я хочу, является чем-то как

int funcName(int foo, bar* = NULL);

Кроме того, действительно ли перегрузка функции возможна в ANSI C?

Нуждался бы

const char* foo_property(foo_t* /* this */, int /* property_number*/);

const char* foo_property(foo_t* /* this */, const char* /* key */, int /* iter */);

Мог, конечно, просто назвать их по-другому, но привыкший к C++ я отчасти привык для перегрузки функции.

18
задан inquam 7 June 2010 в 08:36
поделиться

5 ответов

Нет, Стандарт C тоже не поддерживает. Почему вы считаете, что вам нужно преобразовать код C ++ в C? Это может быть довольно сложно - я бы подумал, что написание оберток будет лучшим вариантом, если ваш C ++ должен быть вызван из C.

29
ответ дан 30 November 2019 в 05:53
поделиться

Вы не можете так просто, поскольку C не поддерживает их. Более простой способ получить «ложную перегрузку» - использовать суффиксы, как уже говорилось ... значения по умолчанию можно моделировать с помощью функции переменных аргументов, указав количество переданных аргументов и программно задав значение по умолчанию для пропущенного, например:

 aType aFunction(int nargs, ...)
 {
   // "initialization" code and vars
   switch(nargs)
   {
     case 0:
         // all to default values... e.g.
         aVar1 = 5; // ...
         break;
     case 1:
         aVar1 = va_arg(arglist, int); //...
         // initialize aVar2, 3, ... to defaults...
         break;
     // ...
   }
 }

Также перегрузку можно смоделировать с помощью var args с дополнительной информацией, которую нужно добавить и передать, и extracode ... в основном воспроизводя минималистскую объектно-ориентированную среду выполнения ... Другое решение (или действительно такое же, но с другим подходом) могло бы использовать теги: каждый аргумент - это пара аргументов типа + аргумент (объединение для всего набора возможных типов аргументов), есть специальный тег терминатора (нет необходимости указывать, как много аргументов, которые вы передаете), и, конечно же, вам всегда нужно «сотрудничество» с функцией, которую вы вызываете, то есть она должна содержать дополнительный код для анализа тегов и выбора фактической функции, которую нужно выполнить (она ведет себя как своего рода диспетчер)

1
ответ дан 30 November 2019 в 05:53
поделиться

Вам придется объявлять каждую перегруженную функцию C ++ по-разному в C, потому что C не выполняет изменения имени . В вашем случае "foo_property1" "foo_property2".

0
ответ дан 30 November 2019 в 05:53
поделиться

Насколько я знаю, ANSI C напрямую не поддерживает перегрузку функций или аргументы по умолчанию. Стандартной заменой перегрузки является добавление суффиксов к имени функции, указывающих на типы аргументов. Например, в OpenGL суффикс "3fv" к имени функции означает, что функция принимает вектор из трех плавающих чисел.

Аргументы по умолчанию можно рассматривать как частный случай перегрузки функций.

3
ответ дан 30 November 2019 в 05:53
поделиться

В ANSI C не существует ни значений по умолчанию, ни перегрузки функций, поэтому вам придется решать эту проблему другим способом.

1
ответ дан 30 November 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: