C - Проверка значений NULL - PullRequest
       1

C - Проверка значений NULL

1 голос
/ 26 октября 2010

Я сталкиваюсь с такими ситуациями:

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

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

ура!

Ответы [ 5 ]

4 голосов
/ 26 октября 2010

Продолжая свой комментарий к @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);

    /* ... */
}

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

1 голос
/ 26 октября 2010

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

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

1 голос
/ 26 октября 2010

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

Например,

# определить FAIL (условие, msg) if ((условие)) {fprintf (stderr, (msg)); выход (1); }

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

FAIL (x == NULL, "не удалось создать экземпляр x");

0 голосов
/ 26 октября 2010

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

Если вы действительно хотите документировать это и на исходном уровне, у C99 есть способ, используя:

void foo(int x[static 1]);

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

void foo(int *x);
void foo(int x[]);
0 голосов
/ 26 октября 2010

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

void assert(int expression);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...