2010-10-26 6 views
1

гряда в различных ситуациях, такие, как это:C - Проверка NULL значение

if(x == NULL) 
{ 
    printf(" The value of X is Null, exiting.."); 
    return -1; 
} 

и эти «ситуации» получает повторяется много, много раз ..... лень в стороне есть лучший способ, чтобы написать это ?

Cheers!

+1

выше проверки для Значение NULL, это можно сделать с помощью MACRO? Это целесообразно ... –

+0

Да, это можно сделать с помощью макроса, но это не рекомендуется. –

ответ

4

На ваш комментарий к @sbi, да, вы можете сделать это с помощью макроса.

#define RETURN_MINUS_ONE_IF_NULL(x) \ 
do \ 
{\ 
    if (x == NULL) \ 
    { \ 
     printf(#x " is null, exiting\n"); \ 
     return -1; \ 
    } \ 
} \ 
while (0) 

Тогда вы могли бы назвать это как

signed int foo (int *x) 
{ 
    RETURN_MINUS_ONE_IF_NULL(x); 

    /* ... */ 
} 

ОДНАКО, я бы настоятельно советовал делать это - маскирует возврат из функции в макрос очень запутанным для случайного читателя.

+0

Спасибо! К сожалению, я не могу пройти через assert route, и это, как вы упомянули ... выглядит слишком беспорядочно :) –

1

Нет причин, по которым макрос нельзя использовать, хотя он должен быть более общим, чем проверка указателей NULL.

Например,

#define СБОЙ (условие, MSG), если ((условие)) {fprintf (STDERR, (MSG)); выход (1); }

Тогда у вас есть,

СБОЙ (х == NULL, "не мог создать экземпляр х");

1

В случае, если эта ситуация не должна произойти вообще, вы ищите концепцию утверждений.

Рассмотрите функцию C assert (int expr). Когда выражение «expr» равно 0 (expr - false, в булевом мире), программа выведет на выход и, как правило, напечатает местоположение, в котором это утверждение не выполнено.

0

Если вы можете поддержать выход процесса, когда указатель имеет нулевое значение, вы должны использовать функцию утверждать, что:

void assert(int expression); 

В противном случае макрос это единственный способ справиться с этим, к сожалению.

+1

'assert' - тоже макрос, кстати. –

0

Лучший способ написать это как комментарий doxygen или запись в любой системе документации, которую вы используете, информируя абонентов о том, что они уже должны знать: NULL недействительный указатель. Даже там, а не в специальном случае замечание о том, что NULL недействительно, имеет смысл просто документировать аргумент x как действительный указатель на тип foo. Это также покрывает миллиарды других недопустимых значений указателя. Лично я предпочитаю не тратить время на документирование этого требования для каждой функции, а вместо этого документировать как общую часть моих интерфейсов библиотеки, которые, если не указано иное для конкретной функции, все аргументы указателя должны быть действительными указателями на объекты соответствующего типа.

Если вы действительно хотите, чтобы документировать это на уровне исходного кода тоже, C99 есть способ, с помощью:

void foo(int x[static 1]); 

вместо одного из следующих действий:

void foo(int *x); 
void foo(int x[]); 
Смежные вопросы