我可以声明一个具有未确定返回类型的C函数(没有C编译器警告)吗?返回类型可以是int
,float
,double
,void *
等。
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]];
}
答案 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不支持动态类型变量(变体),因为它是静态类型的,但可能有一些库可以执行您想要的操作。