OVH Cloud OVH Cloud

return null;

16 réponses
Avatar
Bernard Bandiera
Bonsoir.

Vu dans un programme, aujourd'hui :

void mafonction()
{
....
return null;
}

Est-ce équivalent à return; ? Et est-ce bien orthodoxe ?

Merci de satisfaire ma curiosité.

--
Bernard

Gloire à qui, n'ayant pas d'idéal sacro-saint
Se borne à ne pas trop emmerder son voisin
Georges Brassens - Don Juan

10 réponses

1 2
Avatar
Éric Lévénez
Le 24/09/03 20:16, dans <bksn1h$582$, « Bernard
Bandiera » a écrit :

Vu dans un programme, aujourd'hui :

void mafonction()
{
....
return null;
}

Est-ce équivalent à return; ? Et est-ce bien orthodoxe ?


Il aurait aussi pu faire :

return rien_du_tou(42);

Avec un bon :

#define rien_du_tout(x)


--
Éric Lévénez -- <http://www.levenez.com>
Unix is not only an OS, it's a way of life.

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Bernard Bandiera" wrote:

Vu dans un programme, aujourd'hui :

void mafonction()
{
....
return null;
}

Est-ce équivalent à return; ? Et est-ce bien orthodoxe ?


C'est peut être une extension de ton compilateur. AMA, à supprimer.
En tout cas, ce n'est pas du C. Ou alors, il faut fournir une définition de
'null'

#define null

par exemple...

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Yves ROMAN

Bonsoir.

Vu dans un programme, aujourd'hui :

void mafonction()
{
....
return null;
}

Est-ce équivalent à return; ? Et est-ce bien orthodoxe ?



Ca n'est pas normal si c'est NULL et non null

Curieusement sur VC++ ca ne donne qu'un Warning avec NULL !

ca ne serait pas plutot :

void* mafonction()
{
....
return NULL ;
}

Avatar
Bernard Bandiera
Yves ROMAN écrivait dans le message news: :

Ca n'est pas normal si c'est NULL et non null

Curieusement sur VC++ ca ne donne qu'un Warning avec NULL !

ca ne serait pas plutot :

void* mafonction()
{
....
return NULL ;
}
Bien, vu, c'était bien NULL et non pas null

Entretemps, j'ai un peu fouillé et j'ai trouvé ça dans le fichier d'en-tête
stdio.h (de VC++) :

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

Donc, in fine, ça revient à faire return (void *) 0;
J'ai fait un p'tit test, mon compilo (VC++) me donne un warning (c'est bien
la moindre des choses !) Mais comme souvent bien des gens ne regardent pas
les warnings (à mon avis, ils ont bien tort mais bon).

Du coup, j'ai une autre question : ce que j'ai trouvé dans stdio.h, c'est
tout à fait standard, ou c'est une extension de certains compilos ? (je l'ai
trouvé aussi avec dev-C++, mais dans stddef.h, qui est lui-même inclus dans
stdio.h)

Merci !
--
Bernard

Gloire à qui, n'ayant pas d'idéal sacro-saint
Se borne à ne pas trop emmerder son voisin
Georges Brassens - Don Juan

Avatar
Anthony Fleury
"Bernard Bandiera" a écrit dans le message news:
bkv9ie$hkp$

Entretemps, j'ai un peu fouillé et j'ai trouvé ça dans le fichier
d'en-tête

stdio.h (de VC++) :

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif



[...]

Du coup, j'ai une autre question : ce que j'ai trouvé dans stdio.h, c'est
tout à fait standard, ou c'est une extension de certains compilos ? (je
l'ai

trouvé aussi avec dev-C++, mais dans stddef.h, qui est lui-même inclus
dans

stdio.h)



NULL est défini par la norme du C. C'est défini comme étant un pointeur
constant sur une adresse invalide si je ne me trompe pas! (J'ai pas la norme
sous la main pour vérifier) Sa valeur ( (void*) 0 est une spécificité de ton
implémentation par contre.

De plus, elle est d'après la norme, définie dans <stddef.h>

--
Anthony

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Bernard Bandiera" wrote:

Bien, vu, c'était bien NULL et non pas null
Entretemps, j'ai un peu fouillé et j'ai trouvé ça dans le fichier
d'en-tête stdio.h (de VC++) :


En principe, on ne doit pas regarder ce qui se trouve dans les entête d'une
implémentation... Ce qui s'y trouve pourrait très bien ne pas être du C du
tout...

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

Donc, in fine, ça revient à faire return (void *) 0;


Ce qui est une erreur, vu que ta fonction est définie ne retournant rien
(void).

J'ai fait un p'tit test, mon compilo (VC++) me donne un warning (c'est
bien la moindre des choses !) Mais comme souvent bien des gens ne
regardent pas les warnings (à mon avis, ils ont bien tort mais bon).


Ok, pour le warning. Il y a toujours des gens qui aiment se tirer une balle
dans le pied. Ils ne durent pas très longtemps...

Du coup, j'ai une autre question : ce que j'ai trouvé dans stdio.h,
c'est tout à fait standard, ou c'est une extension de certains compilos


C'est une des façons standards de définir le pointeur constant nul (dit
NULL).

? (je l'ai trouvé aussi avec dev-C++, mais dans stddef.h, qui est
lui-même inclus dans stdio.h)


En principe, effectivement, la définition de NULL est censée se trouver dans
<stddef.h>

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Anthony Fleury"
wrote:

NULL est défini par la norme du C. <...> Sa valeur ( (void*) 0 est une
spécificité de ton implémentation par contre.


Non. C'est une des façons standard de définir NULL. L'autre étant

#define NULL 0

Ce qui est une spécificité de l'implémentation, c'est la manière dont NULL
(ou 0) est traduit dans le contexte d'un pointeur. Ca peut être une valeur
immédiate genre 0 ou $80000000 ou n'importe quoi d'autre susceptible d'être
interprété par l'architecture (CPU, MMU et.)

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
manu l.
"Anthony Fleury" a écrit dans le
message de news:bkvfun$atl$
"Bernard Bandiera" a écrit dans le message news:
bkv9ie$hkp$

Entretemps, j'ai un peu fouillé et j'ai trouvé ça dans le fichier
d'en-tête

stdio.h (de VC++) :

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif



[...]

Du coup, j'ai une autre question : ce que j'ai trouvé dans stdio.h,
c'est


tout à fait standard, ou c'est une extension de certains compilos ? (je
l'ai

trouvé aussi avec dev-C++, mais dans stddef.h, qui est lui-même inclus
dans

stdio.h)



NULL est défini par la norme du C. C'est défini comme étant un pointeur
constant sur une adresse invalide si je ne me trompe pas! (J'ai pas la
norme


"NULL qui se développe en une constante pointeur nul définie par
l'implémentation." (C 90 7.1.6, "Définitions de base <stddef.h>")

sous la main pour vérifier) Sa valeur ( (void*) 0 est une spécificité de
ton

implémentation par contre.

De plus, elle est d'après la norme, définie dans <stddef.h>


Dans <locale.h>, <stddef.h>, <stdio.h>, <stdlib.h>, <string.h> et <time.h>


--
Anthony




--
manu l.


Avatar
Yves ROMAN

Yves ROMAN écrivait dans le message news: :

Ca n'est pas normal si c'est NULL et non null

Curieusement sur VC++ ca ne donne qu'un Warning avec NULL !

ca ne serait pas plutot :

void* mafonction()
{
....
return NULL ;
}
Bien, vu, c'était bien NULL et non pas null



et c'etait bien void mafonction et non void* mafonction ?


Avatar
Jean-Marc Bourguet
AG writes:

Emmanuel Delahaye wrote:
In 'fr.comp.lang.c', "Anthony Fleury"
NULL est défini par la norme du C. <...> Sa valeur ( (void*) 0 est une
spécificité de ton implémentation par contre.
Non. C'est une des façons standard de définir NULL. L'autre étant

#define NULL 0



Et en fonction de quoi choisi-t-on l'une plutot que l'autre ?


Classiquement, NULL etait defini a 0. Et utilise parfois pour d'autre
choses que des pointeurs.

Ca pose des problemes sur les machines ou sizeof(int) != sizeof(void*)
quand on passe des pointeurs a des fonctions sans prototypes (cas
moins frequent de nos jours) ou ayant un nombre variable de parametres
(cas toujours existant) car il faut caster NULL en (void*) pour que le
passage se fasse correctement -- erreur generalement indetectable sur
les autres architectures.

Comme le code ayant ce probleme etait courant, les compilateurs 16
bits pour DOS se sont mis a definir NULL a (void*)0, usage qui a ete
autorise par la norme C (mais pas impose, ce qui fait que c'est un
usage qui n'aide pas vraiment la portabilite: il faut toujours
utiliser (void*)NULL pour passer des parametres quand le compilateur
n'en connait pas le type) mais interdit en C++ (ou utiliser (void*)0
pour NULL imposerait un cast quand le type destination est connu).

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



1 2