При преобразовании 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++ я отчасти привык для перегрузки функции.
Нет, Стандарт C тоже не поддерживает. Почему вы считаете, что вам нужно преобразовать код C ++ в C? Это может быть довольно сложно - я бы подумал, что написание оберток будет лучшим вариантом, если ваш C ++ должен быть вызван из C.
Вы не можете так просто, поскольку 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 ... в основном воспроизводя минималистскую объектно-ориентированную среду выполнения ... Другое решение (или действительно такое же, но с другим подходом) могло бы использовать теги: каждый аргумент - это пара аргументов типа + аргумент (объединение для всего набора возможных типов аргументов), есть специальный тег терминатора (нет необходимости указывать, как много аргументов, которые вы передаете), и, конечно же, вам всегда нужно «сотрудничество» с функцией, которую вы вызываете, то есть она должна содержать дополнительный код для анализа тегов и выбора фактической функции, которую нужно выполнить (она ведет себя как своего рода диспетчер)
Вам придется объявлять каждую перегруженную функцию C ++ по-разному в C, потому что C не выполняет изменения имени . В вашем случае "foo_property1" "foo_property2".
Насколько я знаю, ANSI C напрямую не поддерживает перегрузку функций или аргументы по умолчанию. Стандартной заменой перегрузки является добавление суффиксов к имени функции, указывающих на типы аргументов. Например, в OpenGL суффикс "3fv" к имени функции означает, что функция принимает вектор из трех плавающих чисел.
Аргументы по умолчанию можно рассматривать как частный случай перегрузки функций.
В ANSI C не существует ни значений по умолчанию, ни перегрузки функций, поэтому вам придется решать эту проблему другим способом.