如何使用未确定的返回类型声明C函数?

时间:2013-09-14 17:08:59

标签: objective-c c function return-type

我可以声明一个具有未确定返回类型的C函数(没有C编译器警告)吗?返回类型可以是intfloatdoublevoid *等。

undetermined_return_type miscellaneousFunction(undetermined_return_type inputValue);

你可以在其他函数中使用这个函数来返回一个值(虽然这可能是一个运行时错误):

BOOL isHappy(int feel){
    return miscellaneousFunction(feel);
};

float percentage(float sales){
    return miscellaneousFunction(sales);
};

我在寻找什么:

使用undefined-return-type声明和实现C函数(或Obj-C方法)对于面向方面的编程非常有用。

如果我可以在运行时拦截另一个函数中的Obj-C消息,我可能会通过执行其他操作将该消息的值返回给原始接收者。例如:

- (unknown_return_type) interceptMessage:(unknown_return_type retValOfMessage){
    // I may print the value here
    // No idea how to print the retValOfMessage (I mark the code with %???)
    print ("The message has been intercepted, and the return value of the message is %???", retValOfMessage);

    // Or do something you want (e.g. lock/unlock, database open/close, and so on).
    // And you might modify the retValOfMessage before returning.
    return retValOfMessage;
}

所以我可以通过一些补充来拦截原始消息:

// Original Method
- (int) isHappy{
    return [self calculateHowHappyNow];
}

// With Interception
- (int) isHappy{
    // This would print the information on the console.
    return [self interceptMessage:[self calculateHowHappyNow]];
}

4 个答案:

答案 0 :(得分:3)

您可以使用void *类型。

然后例如:

float percentage(float sales){
    return *(float *) miscellaneousFunction(sales);
}

请确保不要返回指向具有自动存储持续时间的对象的指针。

答案 1 :(得分:1)

您可以使用预处理器。

#include <stdio.h>

#define FUNC(return_type, name, arg)        \
return_type name(return_type arg)           \
{                                           \
    return miscellaneousFunction(arg);      \
}

FUNC(float, undefined_return_func, arg)

int main(int argc, char *argv[])
{
    printf("\n %f \n", undefined_return_func(3.14159));
    return 0;
}

答案 2 :(得分:1)

可能是thejh

建议的union
typedef struct 
{
  enum {
      INT,
      FLOAT,  
      DOUBLE
  } ret_type;
  union
    {
       double d;
       float f;
       int i; 
    } ret_val;
} any_type;

any_type miscellaneousFunction(any_type inputValue) {/*return inputValue;*/}

any_type isHappy(any_type feel){
    return miscellaneousFunction(feel);
}

any_type percentage(any_type sales){
    return miscellaneousFunction(sales);
}

通过ret_type,您可以了解返回值的数据类型,ret_type. i,f,d可以为您提供相应的值。

所有元素都将使用相同的内存空间,只能访问一个内存空间。

答案 3 :(得分:0)

Straight C不支持动态类型变量(变体),因为它是静态类型的,但可能有一些库可以执行您想要的操作。