2010-10-26 12 views
1

Je viens dans des situations telles que celle-ci:C - Vérification des valeurs NULL

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

et cette « situation » se répète beaucoup, beaucoup de fois ..... la paresse de côté est-il une meilleure façon d'écrire ce ?

À la votre!

+1

Le chèque ci-dessus pour une Valeur NULL, peut-il être fait via une MACRO? Est-ce conseillé ... –

+0

Oui, cela peut être fait avec une macro, mais ce n'est pas recommandé. –

Répondre

4

En allant sur votre commentaire à @sbi, oui vous pouvez le faire avec une macro.

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

Ensuite, vous appelez cela comme

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

    /* ... */ 
} 

Cependant, je vous conseille vivement contre le faire - cacher un retour d'une fonction dans une macro est très déroutant pour un lecteur occasionnel.

+0

Merci! Malheureusement, je ne peux pas passer par l'affirmer route et ce que vous avez mentionné ... semble trop désordonné :) –

1

Il n'y a aucune raison pour laquelle une macro ne peut pas être utilisée, bien qu'elle devrait être plus générale que la vérification des pointeurs NULL.

Par exemple,

#define FAIL (condition, msg) si ((condition)) {fprintf (stderr, (msg)); sortie (1); }

Ensuite, vous avez,

FAIL (x == NULL, "ne pouvait pas instancier x");

1

Dans le cas où cette situation n'est pas censée se produire , vous recherchez le concept d'assertions.

Considérons la fonction C "assert (int expr)". Lorsque "expr" est égal à 0 (expr est faux, dans un monde booléen), le programme quittera et imprimera (généralement) l'emplacement où l'assertion a échoué.

0

Si vous pouvez soutenir la sortie du processus lorsque le pointeur est nul, vous devez utiliser la fonction assert:

void assert(int expression); 

Sinon, la macro est la seule façon de gérer cela malheureusement.

+1

'assert' est aussi une macro, d'ailleurs. –

0

La meilleure façon d'écrire ceci est comme un commentaire doxygen ou une entrée dans n'importe quel système de documentation que vous utilisez, informant les appelants de quelque chose qu'ils devraient déjà savoir: NULL n'est pas un pointeur valide. Même là, plutôt que spécial-casing la remarque que NULL n'est pas valide, il est plus logique de documenter simplement l'argument x comme étant un pointeur valide au type foo. Cela couvre également les milliards d'autres valeurs de pointeurs invalides. Personnellement je préfère ne pas perdre de temps à documenter cette exigence pour chaque fonction mais plutôt documenter en tant que partie générale de mes interfaces de bibliothèque que, sauf indication contraire pour une fonction particulière, tous les arguments pointeurs doivent être des pointeurs valides aux objets du type correspondant.

Si vous voulez vraiment documenter ce au niveau de la source aussi, C99 a une façon, en utilisant:

void foo(int x[static 1]); 

au lieu d'une des opérations suivantes:

void foo(int *x); 
void foo(int x[]);