безопасное литье в C - PullRequest
0 голосов
/ 23 мая 2011

Привет всем, у меня есть этот фрагмент кода:

void writer(void* param){
    if(NULL == param){
        return;
    }
    param = (param_t*)param;
...
}

это безопасный код или нет, param относится к типу param_t *, но мне надоело каждый раз, когда я использую его в функции, есть ли у кого-нибудь другое элегантное решение? заранее спасибо

Ответы [ 4 ]

5 голосов
/ 23 мая 2011

Странный неоператор.

Когда вы определяете функцию, вы говорите, что param имеет тип void*.
Затем с помощью приведения вы явно конвертируете его в param_t*
И компилятор неявно преобразует это param_t* в void* с присваиванием.

Вам нужна другая переменная

void writer(void *param) {
    param_t *internal_param;

    if (NULL == param) return;
    internal_param = param;
    /* ... */
}
2 голосов
/ 23 мая 2011

(Неявное) приведение в присваивании безопасно, даже если значение указателя равно NULL, поэтому нет необходимости его откладывать.Вы можете сделать это:

void writer(void* param)
{
  param_t* myparam = param;

  if (myparam == NULL)
    return;

  ...
}
2 голосов
/ 23 мая 2011

Вам не нужно приводить void * к другому типу указателя в C.

Так что просто сделайте:

void writer(void* param){
   param_t *myparam;
    if(NULL == param){
        return;
    }
    myparam = param;
...
}

(Но почему вы все равно используете void * для аргумента?)

1 голос
/ 23 мая 2011

Очевидное решение состоит в том, чтобы избегать использования void * и использовать вместо него param_t *, как в:

void writer(param_t * param)
{
  if (param == NULL)
  {
    return;
  }

  ...
}

Вы можете отказаться от теста NULL, если вы знаете , что он никогда не вызывается с указателем NULL. Кроме того, вы можете заменить его на assert(param != NULL).

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