展开C

时间:2015-07-08 11:28:23

标签: objective-c c variadic-functions

我在Objective C项目中使用C库。 C库提供以下功能

void processData(...);

可以与1,2或3个参数一起使用,其中第一个参数是必需的,可以有不同的类型intdoublelongfloat和其他两个参数是可选的,具有intlong值,可以按任何顺序排列。

使用此功能的例子有:

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包装器,使用正确的参数调用processDataData类具有允许获取数据类型(第一个参数),其值以及第二个和第三个参数是否具有值及其值的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);          
}

0 个答案:

没有答案