Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在C语言中展开参数列表_Objective C_C_Variadic Functions - Fatal编程技术网

Objective 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()

我在我的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);
我需要制作一个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);          
}