как вернуть NULL для двойной функции с компилятором Intel C? - PullRequest
2 голосов
/ 27 мая 2010

У меня есть код, который я портирую из системы SGI с помощью компилятора MIPS. У него есть функции, которые объявлены с двойным типом возврата. Если функция не может найти правильный дубль, эти функции возвращают "NULL"

Компилятору intel C это не нравится, но я пытался узнать, есть ли опция компилятора, чтобы включить эту «функцию», чтобы я мог компилировать без изменения кода. Я проверил справочную страницу и, похоже, не могу ее найти.

Спасибо

Пример кода, который существует в настоящее время и отлично работает с MIPS

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

компилятор intel жалуется: ошибка: тип возвращаемого значения не соответствует типу функции

Ответы [ 6 ]

3 голосов
/ 27 мая 2010

Может быть возможность "NaN" (не число) через опции компилятора. Но это все равно не будет нулевым.

2 голосов
/ 27 мая 2010

Основано на вашем комментарии:

Я только что проверил, и вызывающие функции просто используют его, как если бы он был действительным double (в операторе if)

Я бы просто изменил функцию на return 0; вместо return NULL;

1 голос
/ 27 мая 2010

Вы уверены, что они не возвращают указатель на double? Двойной NULL не имеет смысла, так как нулевой является допустимым значением для double.

1 голос
/ 27 мая 2010

Это не опция компилятора, но вы можете #define NULL 0 (теоретически) получить желаемый эффект.

0 голосов
/ 27 мая 2010

Я думаю, я просто буду использовать #ifdef INTEL для флага компилятора и определю возвращаемое значение как ноль для этой опции времени компиляции. Вид боли, но, кажется, лучший способ.

0 голосов
/ 27 мая 2010

NULL не обязательно имеет особое значение, когда оно возвращается из функции. Если вы хотите указать, что функция не завершилась успешно, обычным способом является возвращение некоторого значения, которое никогда не будет возвращено при нормальных обстоятельствах. Обычно это означает возврат неверного значения. Когда функция возвращает указатель, она часто использует NULL в качестве возвращаемого значения, сигнализирующего об ошибке, поскольку указатель NULL редко является значением, которое пользователь может ожидать от функции.

Константа NULL имеет значение только в контексте указателей, и, поскольку вы возвращаете скалярное значение, компилятор говорит вам об использовании NULL. Вместо того, чтобы возвращать NULL, найдите какое-то значение, которое никогда не может быть допустимым возвращаемым значением, и используйте его в качестве индикатора ошибки. Чтобы было более понятно, что вы делаете, присвойте этому значению константу, используя #define AN_ERROR_OCCURED <<someval>>, чтобы избежать использования "магических чисел".

Другой распространенный способ сделать это - использовать глобальный errno ( см. Errno.h ). Если ваша функция обнаруживает ошибку, установите errno на ненулевое значение перед возвратом. Затем код, вызывающий вашу функцию, может проверять и обрабатывать ошибки, используя что-то вроде if (errno) {...}.

Еще один метод состоит в том, чтобы функция возвращала ноль в случае успеха и ненулевой код ошибки в противном случае. Если пользователю необходимо получить данные из функции, в функцию должен быть передан дополнительный указатель «буфера возврата».

...