我有一些代码,我使用MIPS编译器从SGI系统移植。它具有声明具有双返回类型的函数。如果函数找不到正确的double,那些函数将返回“NULL”
intel C编译器不喜欢这样,但我试图看看是否有一个编译器选项来启用这个“功能”,这样我就可以在不改变代码的情况下进行编译。我检查了手册页,似乎无法找到它。
由于
当前存在的代码示例,并且可以正常使用MIPS
double some_function(int param){
double test = 26.25;
if(param == 10){
return test;
}
return (NULL);
}
intel编译器抱怨: 错误:返回值类型与函数类型
不匹配答案 0 :(得分:3)
通过编译器选项可能存在“NaN”(非数字)功能。但那仍然不会是空的。
答案 1 :(得分:2)
根据您的评论:
我刚检查过,调用函数只是使用它,好像它是一个有效的double(在if语句中)
我只是将功能修改为return 0;
而不是return NULL;
答案 2 :(得分:1)
这不是编译器选项,但您可以#define NULL 0
(理论上)获得所需的效果。
答案 3 :(得分:1)
你确定他们没有返回指向双倍的指针吗? NULL double是没有意义的,因为零是double的有效值。
答案 4 :(得分:0)
NULL
不一定具有特殊含义。如果要指示函数未成功完成,常用技术是返回一些在正常情况下永远不会返回的值。通常,这意味着返回无效值。当函数返回指针时,它通常使用NULL
作为返回值来表示错误,因为NULL
指针很少是用户期望函数返回的值。
常量NULL
仅在指针的上下文中有意义,并且由于您返回标量值,编译器正在抓紧使用NULL
。而不是返回NULL
,找到一些永远不会是有效返回值的值,并将其用作错误指示符。为了更清楚地了解您正在做什么,请使用#define AN_ERROR_OCCURED <<someval>>
使用常量对该值进行别名,以避免使用“幻数”。
另一种常见的方法是使用errno
全局(see errno.h)。如果您的函数遇到错误,请在返回之前将errno
设置为某个非零值。然后,调用您的函数的代码可以使用if (errno) {...}
等内容检查和处理错误。
另一种方法是,如果成功则返回零,否则返回非零错误代码。如果用户需要从函数中获取数据,则必须将额外的“返回缓冲区”指针传递给函数。
答案 5 :(得分:0)
我想我只会使用#ifdef INTEL作为编译器标志,并为该编译时选项定义返回值为零。有点痛,但似乎是最好的方式。