我在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();
processData(myInt);
processData(myInt, dataQuality);
processData(myDouble, dataQuality, dataTimestamp);
processData(myDouble, dataTimestamp);
我需要制作一个使用DataType
类的Objetive C包装器,使用正确的参数调用processData
。 Data
类具有允许获取数据类型(第一个参数),其值以及第二个和第三个参数是否具有值及其值的getter。
问题是如何进行此扩展?我认为它必须在编译时完成,我认为C中唯一可用的机制是宏。但我从未使用过它们。实现应该是这样的(以下是伪代码,其中参数列表在运行时进行评估,我猜应该用宏替换,以便在编译时评估参数):
-(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);
}