Ruby Extension - параметры по умолчанию - C (СИ)
Формулировка задачи:
Приветствую! Насколько я помню, в С в методах нельзя сделать параметры по умолчанию.
Я же пытаюсь перенести ruby код в С(Ruby Extension) и оригинальный метод имеет два необязательных параметра.
Подскажите, что можно сделать?
Пример:
То же, но в ruby:
#include "ruby.h" VALUE Test = Qnil; VALUE method_just_test(); void Init_test(){ Test = rb_define_module("Test"); rb_define_method(Test, "just_test", method_just_test, 7); } VALUE method_just_test(VALUE self, VALUE id, VALUE icon, VALUE text, VALUE name, VALUE state, VALUE trigger, VALUE trig_par){ printf("ЙА ТЕКСТ!\n"); }
module Test def just_test(id, icon, text, name, state, trigger=nil, trig_par=nil) #Что-то делает end end
Решение задачи: «Ruby Extension - параметры по умолчанию»
textual
Листинг программы
#include <stdio.h> /* emulating function with default arguments int f(float x, double y, int z, char k); (any) (any) (default = 12) (default = 'k') */ typedef struct { float x; double y; int z; char k; } TFunctionArgs; int BaseFunction(float x, double y, int z, char k) { printf("args(x,y,z,k) : %.2f %.4f %d %c\n", x, y, z, k); return z; } int WrapperFunction(TFunctionArgs args) { float exportX = args.x; double exportY = args.y; int exportZ = args.z ? args.z : 12; char exportK = args.k ? args.k : 'k'; return BaseFunction(exportX, exportY, exportZ, exportK); } #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #define f(...) WrapperFunction((TFunctionArgs){__VA_ARGS__}) int main(void) { f(2, 4); f(8, 15, 2, 'z'); return 0; }
Объяснение кода листинга программы
В этом коде:
- Создается структура
TFunctionArgs
, которая содержит четыре поля:x
,y
,z
иk
. Типы данных этих полей:float
,double
,int
иchar
соответственно. - Определяется функция
BaseFunction
, которая принимает четыре аргумента типаfloat
,double
,int
иchar
. Внутри функции происходит вывод значений этих аргументов на консоль. - Определяется функция
WrapperFunction
, которая принимает один аргумент типаTFunctionArgs
. Внутри функции происходит приведение аргумента к типуfloat
,double
,int
иchar
и передача этих значений в функциюBaseFunction
. - Используется директива препроцессора
#pragma GCC diagnostic ignored
-Wmissing-field-initializers``, которая игнорирует предупреждение компилятора о пропущенных инициализаторах. - Определяется макрос
f(...)
, который расширяется в вызов функцииWrapperFunction
с аргументом, сформированным из переменных, переданных в макрос через запятую. - В функции
main
происходит вызов макросаf
с двумя аргументами (2 и 4) и с тремя аргументами (8, 15 и 2) и ('z'). - Возвращаемое значение функции
BaseFunction
в обоих случаях равно 2.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д