Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Eric Levenez wrote:Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Intéressant ça. Et quelle est la raison exacte ?
Eric Levenez <news@levenez.com> wrote:
Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Intéressant ça. Et quelle est la raison exacte ?
Eric Levenez wrote:Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Intéressant ça. Et quelle est la raison exacte ?
Eric Levenez writes:Le 16/08/06 22:50, dans ,
« Pascal Bourguignon » a écrit :#define PTR(x) (&(x))
#define DEREF(x) (*(x))
etc...
Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Il n'est pas caché, il est mis en ÉVIDENCE, avec trois ou cinq
caractères majuscules au lieu d'un seul. ;-)
Eric Levenez <news@levenez.com> writes:
Le 16/08/06 22:50, dans <87hd0co15y.fsf@thalassa.informatimago.com>,
« Pascal Bourguignon » <pjb@informatimago.com> a écrit :
#define PTR(x) (&(x))
#define DEREF(x) (*(x))
etc...
Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Il n'est pas caché, il est mis en ÉVIDENCE, avec trois ou cinq
caractères majuscules au lieu d'un seul. ;-)
Eric Levenez writes:Le 16/08/06 22:50, dans ,
« Pascal Bourguignon » a écrit :#define PTR(x) (&(x))
#define DEREF(x) (*(x))
etc...
Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Il n'est pas caché, il est mis en ÉVIDENCE, avec trois ou cinq
caractères majuscules au lieu d'un seul. ;-)
Eric Levenez wrote:Et bien si, il suffit de regarder tout le thread sur le true/false
pour s'en convaincre.
dans ce cas certains devs d'Apple ferait bien de lire les bases...
dans une des pages Apple il y a un mélange de BOOL ObjC et de Boolean
CF###... coup de pot il passe NO.
contrairement à ce que tu crois je me suis posé des questions à ce sujet
mais comme Apple le faisait je me suis dit : ça doit rouler, si ça
déconne je verrais plus tard.
d'ailleurs dans les tutaux que j'ai lu, ils ne parlent pas ou peu de ces
conversions de valeur logique et pour cause, ils écrivent dans un C
homogène, ce qui n'est pas mon cas.
Comment bien utiliser les includes, et comment les inclure dans le bon
ordre, c'est la pratique du C. Quand on a saisi le principe, on peut adapter
cela à n'importe quelle plate-forme.
j'ai lu des tutaux sur les includes, ils ne parlaient pas de "bon
ordre", dans la même veine,
j'ai lu un tutau qui disait que l'ordre des
méthodes était indifférent. J'ai constaté que ce n'est pas vrai.
perso, tout ce que je voulais faire c'est une extension ruby en C,
l'ayant déjà réalisée en ObjC (facilement), c'est ma motivation. je ne
ferai peut-être rien d'autre en C.
Eric Levenez <news@levenez.com> wrote:
Et bien si, il suffit de regarder tout le thread sur le true/false
pour s'en convaincre.
dans ce cas certains devs d'Apple ferait bien de lire les bases...
dans une des pages Apple il y a un mélange de BOOL ObjC et de Boolean
CF###... coup de pot il passe NO.
contrairement à ce que tu crois je me suis posé des questions à ce sujet
mais comme Apple le faisait je me suis dit : ça doit rouler, si ça
déconne je verrais plus tard.
d'ailleurs dans les tutaux que j'ai lu, ils ne parlent pas ou peu de ces
conversions de valeur logique et pour cause, ils écrivent dans un C
homogène, ce qui n'est pas mon cas.
Comment bien utiliser les includes, et comment les inclure dans le bon
ordre, c'est la pratique du C. Quand on a saisi le principe, on peut adapter
cela à n'importe quelle plate-forme.
j'ai lu des tutaux sur les includes, ils ne parlaient pas de "bon
ordre", dans la même veine,
j'ai lu un tutau qui disait que l'ordre des
méthodes était indifférent. J'ai constaté que ce n'est pas vrai.
perso, tout ce que je voulais faire c'est une extension ruby en C,
l'ayant déjà réalisée en ObjC (facilement), c'est ma motivation. je ne
ferai peut-être rien d'autre en C.
Eric Levenez wrote:Et bien si, il suffit de regarder tout le thread sur le true/false
pour s'en convaincre.
dans ce cas certains devs d'Apple ferait bien de lire les bases...
dans une des pages Apple il y a un mélange de BOOL ObjC et de Boolean
CF###... coup de pot il passe NO.
contrairement à ce que tu crois je me suis posé des questions à ce sujet
mais comme Apple le faisait je me suis dit : ça doit rouler, si ça
déconne je verrais plus tard.
d'ailleurs dans les tutaux que j'ai lu, ils ne parlent pas ou peu de ces
conversions de valeur logique et pour cause, ils écrivent dans un C
homogène, ce qui n'est pas mon cas.
Comment bien utiliser les includes, et comment les inclure dans le bon
ordre, c'est la pratique du C. Quand on a saisi le principe, on peut adapter
cela à n'importe quelle plate-forme.
j'ai lu des tutaux sur les includes, ils ne parlaient pas de "bon
ordre", dans la même veine,
j'ai lu un tutau qui disait que l'ordre des
méthodes était indifférent. J'ai constaté que ce n'est pas vrai.
perso, tout ce que je voulais faire c'est une extension ruby en C,
l'ayant déjà réalisée en ObjC (facilement), c'est ma motivation. je ne
ferai peut-être rien d'autre en C.
Parce que cacher un pointeur par un typedef entraîne toujours des problèmes.
Si tu veux t'en convaincre va lire les forums sur le C. Les débutants en C
typiquement mettent un typedef pour définir une structure, puis un autre
typedef pour définir un pointeur sur cette structure et encore un autre pour
le pointeur de pointeur. Après ils ont 40 types de typedef pour le même type
d'objets et ils mettent des casts ou des "&" partout pour arriver à
compiler.
Pour les defines, c'est la même chose
Parce que cacher un pointeur par un typedef entraîne toujours des problèmes.
Si tu veux t'en convaincre va lire les forums sur le C. Les débutants en C
typiquement mettent un typedef pour définir une structure, puis un autre
typedef pour définir un pointeur sur cette structure et encore un autre pour
le pointeur de pointeur. Après ils ont 40 types de typedef pour le même type
d'objets et ils mettent des casts ou des "&" partout pour arriver à
compiler.
Pour les defines, c'est la même chose
Parce que cacher un pointeur par un typedef entraîne toujours des problèmes.
Si tu veux t'en convaincre va lire les forums sur le C. Les débutants en C
typiquement mettent un typedef pour définir une structure, puis un autre
typedef pour définir un pointeur sur cette structure et encore un autre pour
le pointeur de pointeur. Après ils ont 40 types de typedef pour le même type
d'objets et ils mettent des casts ou des "&" partout pour arriver à
compiler.
Pour les defines, c'est la même chose
Eric Levenez wrote:Parce que cacher un pointeur par un typedef entraîne toujours des problèmes.
Toujours ? Ce qui voudrait dire que l'utilisation de CoreFoundation va
*toujours* entrainer des problemes ?
Si tu veux t'en convaincre va lire les forums sur le C. Les débutants en C
typiquement mettent un typedef pour définir une structure, puis un autre
typedef pour définir un pointeur sur cette structure et encore un autre pour
le pointeur de pointeur. Après ils ont 40 types de typedef pour le même type
d'objets et ils mettent des casts ou des "&" partout pour arriver à
compiler.
Personnellement je pense qu'il y a une *large* différence entre un
débutant qui fait des conneries parcequ'il ne connait pas le langage et
ses pièges dans ces moindres recoins, et des gens un peu compétents qui
savent ce qu'ils font *à priori*. Pour CoreFoundation en l'occurence je
trouve que la sémantique du pointeur n'a strictement aucun intérêt et
que le typedef permet de renforcer le principe d'opacité.
Pour les defines, c'est la même chose
Oui, ok, les defines c'est porc, on est bien d'accord la dessus.
Eric Levenez <news@levenez.com> wrote:
Parce que cacher un pointeur par un typedef entraîne toujours des problèmes.
Toujours ? Ce qui voudrait dire que l'utilisation de CoreFoundation va
*toujours* entrainer des problemes ?
Si tu veux t'en convaincre va lire les forums sur le C. Les débutants en C
typiquement mettent un typedef pour définir une structure, puis un autre
typedef pour définir un pointeur sur cette structure et encore un autre pour
le pointeur de pointeur. Après ils ont 40 types de typedef pour le même type
d'objets et ils mettent des casts ou des "&" partout pour arriver à
compiler.
Personnellement je pense qu'il y a une *large* différence entre un
débutant qui fait des conneries parcequ'il ne connait pas le langage et
ses pièges dans ces moindres recoins, et des gens un peu compétents qui
savent ce qu'ils font *à priori*. Pour CoreFoundation en l'occurence je
trouve que la sémantique du pointeur n'a strictement aucun intérêt et
que le typedef permet de renforcer le principe d'opacité.
Pour les defines, c'est la même chose
Oui, ok, les defines c'est porc, on est bien d'accord la dessus.
Eric Levenez wrote:Parce que cacher un pointeur par un typedef entraîne toujours des problèmes.
Toujours ? Ce qui voudrait dire que l'utilisation de CoreFoundation va
*toujours* entrainer des problemes ?
Si tu veux t'en convaincre va lire les forums sur le C. Les débutants en C
typiquement mettent un typedef pour définir une structure, puis un autre
typedef pour définir un pointeur sur cette structure et encore un autre pour
le pointeur de pointeur. Après ils ont 40 types de typedef pour le même type
d'objets et ils mettent des casts ou des "&" partout pour arriver à
compiler.
Personnellement je pense qu'il y a une *large* différence entre un
débutant qui fait des conneries parcequ'il ne connait pas le langage et
ses pièges dans ces moindres recoins, et des gens un peu compétents qui
savent ce qu'ils font *à priori*. Pour CoreFoundation en l'occurence je
trouve que la sémantique du pointeur n'a strictement aucun intérêt et
que le typedef permet de renforcer le principe d'opacité.
Pour les defines, c'est la même chose
Oui, ok, les defines c'est porc, on est bien d'accord la dessus.
Le problème est que le type bool défini par le C99 est dépendant de
l'architecture. Il est parfois implanté en 8 bits et parfois (c'est le
cas pour MacOS X) en 32 bits.
C'est pourquoi, il est hors de question de
le sauvegarder en l'état dans un fichier
voire de l'utiliser dans une
structure, ce qui réduit considérablement son intérêt et c'est bien
dommage.
Le problème est que le type bool défini par le C99 est dépendant de
l'architecture. Il est parfois implanté en 8 bits et parfois (c'est le
cas pour MacOS X) en 32 bits.
C'est pourquoi, il est hors de question de
le sauvegarder en l'état dans un fichier
voire de l'utiliser dans une
structure, ce qui réduit considérablement son intérêt et c'est bien
dommage.
Le problème est que le type bool défini par le C99 est dépendant de
l'architecture. Il est parfois implanté en 8 bits et parfois (c'est le
cas pour MacOS X) en 32 bits.
C'est pourquoi, il est hors de question de
le sauvegarder en l'état dans un fichier
voire de l'utiliser dans une
structure, ce qui réduit considérablement son intérêt et c'est bien
dommage.
La gestion des booléens en C est un problème depuis les origines car il
n'était pas défini dans le K&R et que chaque programmeur le redéfini dans
son bout de code. Si on mélange 2 bouts de code de 2 programmeurs différents
on a potentiellement des problèmes. Maintenant on a le type "bool" en C99,
mais cela n'est pas encore bien accepté par tous les programmeurs. Sans
parler des anciennes API qui ne peuvent pas changer.
Bref Apple ne fait pas, ou ne peut pas faire pour des raisons historiques,
les choses proprement. Et c'est bien dommage.
La gestion des booléens est très compliquée car elle semble simple. On t'a
indiqué sur fr.comp.lang.c certains pièges liés aux tests (impliquant des
hideux define). Et on trouve encore hélas du code avec des choses du genre :
if (not_present != false)
j'ai lu un tutau qui disait que l'ordre des
méthodes était indifférent. J'ai constaté que ce n'est pas vrai.
Je ne parlais pas des méthodes mais des includes.
La gestion des booléens en C est un problème depuis les origines car il
n'était pas défini dans le K&R et que chaque programmeur le redéfini dans
son bout de code. Si on mélange 2 bouts de code de 2 programmeurs différents
on a potentiellement des problèmes. Maintenant on a le type "bool" en C99,
mais cela n'est pas encore bien accepté par tous les programmeurs. Sans
parler des anciennes API qui ne peuvent pas changer.
Bref Apple ne fait pas, ou ne peut pas faire pour des raisons historiques,
les choses proprement. Et c'est bien dommage.
La gestion des booléens est très compliquée car elle semble simple. On t'a
indiqué sur fr.comp.lang.c certains pièges liés aux tests (impliquant des
hideux define). Et on trouve encore hélas du code avec des choses du genre :
if (not_present != false)
j'ai lu un tutau qui disait que l'ordre des
méthodes était indifférent. J'ai constaté que ce n'est pas vrai.
Je ne parlais pas des méthodes mais des includes.
La gestion des booléens en C est un problème depuis les origines car il
n'était pas défini dans le K&R et que chaque programmeur le redéfini dans
son bout de code. Si on mélange 2 bouts de code de 2 programmeurs différents
on a potentiellement des problèmes. Maintenant on a le type "bool" en C99,
mais cela n'est pas encore bien accepté par tous les programmeurs. Sans
parler des anciennes API qui ne peuvent pas changer.
Bref Apple ne fait pas, ou ne peut pas faire pour des raisons historiques,
les choses proprement. Et c'est bien dommage.
La gestion des booléens est très compliquée car elle semble simple. On t'a
indiqué sur fr.comp.lang.c certains pièges liés aux tests (impliquant des
hideux define). Et on trouve encore hélas du code avec des choses du genre :
if (not_present != false)
j'ai lu un tutau qui disait que l'ordre des
méthodes était indifférent. J'ai constaté que ce n'est pas vrai.
Je ne parlais pas des méthodes mais des includes.
Le 17/08/06 1:17, dans , « Pascal
Bourguignon » a écrit :Eric Levenez writes:Le 16/08/06 22:50, dans ,
« Pascal Bourguignon » a écrit :#define PTR(x) (&(x))
#define DEREF(x) (*(x))
etc...
Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Il n'est pas caché, il est mis en ÉVIDENCE, avec trois ou cinq
caractères majuscules au lieu d'un seul. ;-)
En règle générale, les macros sont la plaie du langage C. Ils apportent une
illisibilité du code et des effets de bord toujours surprenant. J'ai déjà vu
du code (C je le précise) du type
DECLARE(int, i);
/* ... */
FOREVER
if (IS_ZERO(i))
EXIT_LOOP;
/* ... */
ENDFOREVER
Comme tu le vois, là aussi tout est en ÉVIDENCE, mais ce n'est pas lisible à
mon goût.
Quand on commence à maquiller le langage c'est qu'on ne se l'est pas
approprié et qu'on essaye de le faire coller à autre chose. Le problème est
alors que cette autre chose est différente pour chaque personne (d'où des
problèmes), alors que le langage de départ est lui identique pour chacun.
Le 17/08/06 1:17, dans <878xlonucd.fsf@thalassa.informatimago.com>, « Pascal
Bourguignon » <pjb@informatimago.com> a écrit :
Eric Levenez <news@levenez.com> writes:
Le 16/08/06 22:50, dans <87hd0co15y.fsf@thalassa.informatimago.com>,
« Pascal Bourguignon » <pjb@informatimago.com> a écrit :
#define PTR(x) (&(x))
#define DEREF(x) (*(x))
etc...
Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Il n'est pas caché, il est mis en ÉVIDENCE, avec trois ou cinq
caractères majuscules au lieu d'un seul. ;-)
En règle générale, les macros sont la plaie du langage C. Ils apportent une
illisibilité du code et des effets de bord toujours surprenant. J'ai déjà vu
du code (C je le précise) du type
DECLARE(int, i);
/* ... */
FOREVER
if (IS_ZERO(i))
EXIT_LOOP;
/* ... */
ENDFOREVER
Comme tu le vois, là aussi tout est en ÉVIDENCE, mais ce n'est pas lisible à
mon goût.
Quand on commence à maquiller le langage c'est qu'on ne se l'est pas
approprié et qu'on essaye de le faire coller à autre chose. Le problème est
alors que cette autre chose est différente pour chaque personne (d'où des
problèmes), alors que le langage de départ est lui identique pour chacun.
Le 17/08/06 1:17, dans , « Pascal
Bourguignon » a écrit :Eric Levenez writes:Le 16/08/06 22:50, dans ,
« Pascal Bourguignon » a écrit :#define PTR(x) (&(x))
#define DEREF(x) (*(x))
etc...
Très mauvaise habitude. Cela doit être dans la FAQ du C : ne jamais essayer
de cacher un pointeur que ce soit par un define ou par un typedef.
Il n'est pas caché, il est mis en ÉVIDENCE, avec trois ou cinq
caractères majuscules au lieu d'un seul. ;-)
En règle générale, les macros sont la plaie du langage C. Ils apportent une
illisibilité du code et des effets de bord toujours surprenant. J'ai déjà vu
du code (C je le précise) du type
DECLARE(int, i);
/* ... */
FOREVER
if (IS_ZERO(i))
EXIT_LOOP;
/* ... */
ENDFOREVER
Comme tu le vois, là aussi tout est en ÉVIDENCE, mais ce n'est pas lisible à
mon goût.
Quand on commence à maquiller le langage c'est qu'on ne se l'est pas
approprié et qu'on essaye de le faire coller à autre chose. Le problème est
alors que cette autre chose est différente pour chaque personne (d'où des
problèmes), alors que le langage de départ est lui identique pour chacun.
Eric Levenez wrote:La gestion des booléens en C est un problème depuis les origines car il
n'était pas défini dans le K&R et que chaque programmeur le redéfini dans
son bout de code. Si on mélange 2 bouts de code de 2 programmeurs différents
on a potentiellement des problèmes. Maintenant on a le type "bool" en C99,
mais cela n'est pas encore bien accepté par tous les programmeurs. Sans
parler des anciennes API qui ne peuvent pas changer.
Bref Apple ne fait pas, ou ne peut pas faire pour des raisons historiques,
les choses proprement. Et c'est bien dommage.
La gestion des booléens est très compliquée car elle semble simple. On t'a
indiqué sur fr.comp.lang.c certains pièges liés aux tests (impliquant des
hideux define). Et on trouve encore hélas du code avec des choses du genre :
if (not_present != false)
ce pb de boolean en C (versus ce qui existe en assembleur) m'a vraiment
déconcerté...
curieux car pour toutes les machines (qq soit le proc) c'est "built-in"
...
ça date de quand exactement C (il y a un C89 donc début années 80 ?)
Eric Levenez <news@levenez.com> wrote:
La gestion des booléens en C est un problème depuis les origines car il
n'était pas défini dans le K&R et que chaque programmeur le redéfini dans
son bout de code. Si on mélange 2 bouts de code de 2 programmeurs différents
on a potentiellement des problèmes. Maintenant on a le type "bool" en C99,
mais cela n'est pas encore bien accepté par tous les programmeurs. Sans
parler des anciennes API qui ne peuvent pas changer.
Bref Apple ne fait pas, ou ne peut pas faire pour des raisons historiques,
les choses proprement. Et c'est bien dommage.
La gestion des booléens est très compliquée car elle semble simple. On t'a
indiqué sur fr.comp.lang.c certains pièges liés aux tests (impliquant des
hideux define). Et on trouve encore hélas du code avec des choses du genre :
if (not_present != false)
ce pb de boolean en C (versus ce qui existe en assembleur) m'a vraiment
déconcerté...
curieux car pour toutes les machines (qq soit le proc) c'est "built-in"
...
ça date de quand exactement C (il y a un C89 donc début années 80 ?)
Eric Levenez wrote:La gestion des booléens en C est un problème depuis les origines car il
n'était pas défini dans le K&R et que chaque programmeur le redéfini dans
son bout de code. Si on mélange 2 bouts de code de 2 programmeurs différents
on a potentiellement des problèmes. Maintenant on a le type "bool" en C99,
mais cela n'est pas encore bien accepté par tous les programmeurs. Sans
parler des anciennes API qui ne peuvent pas changer.
Bref Apple ne fait pas, ou ne peut pas faire pour des raisons historiques,
les choses proprement. Et c'est bien dommage.
La gestion des booléens est très compliquée car elle semble simple. On t'a
indiqué sur fr.comp.lang.c certains pièges liés aux tests (impliquant des
hideux define). Et on trouve encore hélas du code avec des choses du genre :
if (not_present != false)
ce pb de boolean en C (versus ce qui existe en assembleur) m'a vraiment
déconcerté...
curieux car pour toutes les machines (qq soit le proc) c'est "built-in"
...
ça date de quand exactement C (il y a un C89 donc début années 80 ?)