Objective c 在C语言中展开参数列表
我在我的Objective C项目中使用C库。C库提供以下功能Objective c 在C语言中展开参数列表,objective-c,c,variadic-functions,Objective C,C,Variadic Functions,我在我的Objective C项目中使用C库。C库提供以下功能 void processData(...); 它可以与1、2或3个参数一起使用,其中第一个参数是必需的,可以具有不同类型的int、double、long、float,另外两个参数是可选的,具有int和long值,并且可以是任意顺序 此功能的使用示例如下: int myInt = 2; double myDouble = 1.23; int dataQuality = 1; long dataTimestamp= GET_NOW()
void processData(...);
它可以与1、2或3个参数一起使用,其中第一个参数是必需的,可以具有不同类型的int
、double
、long
、float
,另外两个参数是可选的,具有int
和long
值,并且可以是任意顺序
此功能的使用示例如下:
int myInt = 2;
double myDouble = 1.23;
int dataQuality = 1;
long dataTimestamp= GET_NOW();
processData(myInt);
processData(myInt, dataQuality);
processData(myDouble, dataQuality, dataTimestamp);
processData(myDouble, dataTimestamp);
我需要制作一个Objective C包装器,它使用DataType
类调用processData
,并使用正确的参数。Data
类具有允许获取数据类型(第一个参数)、其值以及第二个和第三个参数是否具有值及其值的getter
问题是如何进行此扩展?我认为这必须在编译时完成,我认为C中唯一可用的机制就是宏。但我从来没用过。实现应该是这样的(以下是伪代码,其中参数列表是在运行时计算的,我想应该用宏替换它,以便在编译时计算参数):
-(void)ObjetiveProcessData:(数据)d{
argumentList={}
开关(d.getDataType()){
案例类型:
append(argumentList,d.getValueAsInt());//我可能弄错了,但是……看起来您需要的是标准c99中的一个宏来允许c函数使用“varargs”?也许这是一个很好的线索?或者是这个?如果数据
类有getter,并且如果您依赖于调用getter,那么我看不出如何在编译时实现这一点。(??)
-(void) objetiveCProcessData: (Data) d {
argumentList = {}
switch (d.getDataType()) {
case INT_TYPE:
append(argumentList, d.getValueAsInt()); // <-- appends a value with type `int`
break;
case DOUBLE_TYPE:
append(argumentList, d.getValueAsDouble()); // <-- appends a value with type `double`
break;
...
}
if (d.hasQuality()) {
append(argumentList, d.getQuality());
}
if (d.hasTimeStamp()) {
append(argumentList, d.getTimestamp());
}
// Call to the C function with correct number and type of arguments
processData(argumentList);
}