2

我有一些使用 MIPS 编译器从 SGI 系统移植的代码。它具有声明为具有双重返回类型的函数。如果函数找不到正确的双精度,这些函数返回“NULL”

intel C 编译器不喜欢这样,但我试图查看是否有编译器选项可以启用此“功能”,以便我可以在不更改代码的情况下进行编译。我检查了手册页,似乎找不到它。

谢谢

当前存在的代码示例,可与 MIPS 一起正常工作

 double some_function(int param){
     double test = 26.25;
 if(param == 10){
    return test;
 }
 return (NULL);
 }

英特尔编译器抱怨:错误:返回值类型与函数类型不匹配

4

6 回答 6

3

通过编译器选项,可能存在“NaN”(不是数字)功能。但这仍然不会是空的。

于 2010-05-27T16:47:50.570 回答
2

根据您的评论:

我刚刚检查过,调用函数只是使用它,就好像它是一个有效的双精度数(在 if 语句中)

我只是将函数修改return 0;return NULL;

于 2010-05-27T17:04:50.877 回答
1

它不是编译器选项,但您可以#define NULL 0(理论上)获得所需的效果。

于 2010-05-27T16:51:06.087 回答
1

你确定他们不返回指向双精度的指针吗?NULL 双精度是没有意义的,因为零是双精度的有效值。

于 2010-05-27T16:54:11.447 回答
0

NULL从函数返回时不一定有特殊含义。如果你想表明一个函数没有成功完成,常用的技术是返回一些在正常情况下永远不会返回的值。通常,这意味着返回一个无效值。当函数返回一个指针时,它通常NULL用作指示错误的返回值,因为NULL指针很少是用户期望函数返回的值。

该常量NULL仅在指针的上下文中有意义,并且由于您返回一个标量值,因此编译器对您使用NULL. 不要返回NULL,而是找到一些永远不会是有效返回值的值并将其用作错误指示器。为了更清楚地说明您在做什么,请使用常量使用该值的别名,#define AN_ERROR_OCCURED <<someval>>以避免使用“幻数”。

另一种常见的方法是使用errno全局(参见 errno.h)。如果您的函数遇到错误,errno请在返回之前设置为某个非零值。然后,调用您的函数的代码将可以使用类似if (errno) {...}.

还有一种方法是让函数在成功时返回零,否则返回非零错误代码。如果用户需要从函数中取回数据,则必须将额外的“返回缓冲区”指针传递给函数。

于 2010-05-27T17:11:34.433 回答
0

我想我将只使用#ifdef INTEL 作为编译器标志,并将该编译时选项的返回定义为零。有点痛苦,但似乎是最好的方法。

于 2010-05-27T17:12:44.613 回答