[...]C'est en effet l'intention des auteurs de la norme C, au
départ. Selon le compilateur et le système, en revanche...
Sur beaucoup de systèmes, le volatile marche exactement
comme on s'y attendrait, tant qu'il n'y a qu'un seul
processeur (ou autre composant hardware) qui s'y accède. La
plupart des compilateurs que j'ai vu, en revanche,
n'insertent pas de barrière de mémoire, ce qui est
nécessaire dès qu'il y a plus d'une entité hardware qui y
accèdent.
Qu'est-ce qu'une barrière de mémoire ? Un truc qui locke
certains accès pour la durée d'une opération (comme la prise
d'un jeton) ?
[...]Remarquez que la norme autorise à prendre l'adresses d'une
constante (au contraire d'un register par exemple).
Comment ça ? Tu peux prendre l'adresse de n'importe quel
objet. Même un objet déclaré régistre. Le mot clé régistre
(comme inline) n'est qu'une suggestion, et comme dit le note
dans la norme : « the hint can be ignored and in most
implementations it will be ignored if the address of the
object is take. »
Ben, ISO/IEC 9899:1999 (E), $6.7.1, note 100)
The implementation may treat any register declaration simply
as an auto declaration. However, whether or not addressable
storage is actually used, the address of any part of an object
declared with storage-class specifier register cannot be
computed, either explicitly (by use of the unary & operator as
discussed in 6.5.3.2) or implicitly (by converting an array
name to a pointer as discussed in 6.3.2.1). Thus, the only
operator that can be applied to an array declared with
storage-class specifier register is sizeof.
(Mais que je crois qu'en « most implementations »
aujourd'hui, la suggestion est systèmatiquement ignorée.
Sauf peut-être sur une architecture Intel, extrèmement
pauvre en règistres. Et même là, un bon compilateur saurait
mieux faire que le programmeur.)
C'est certain. J'ai déjà plusieurs fois donné *un* exemple
dans lequel certains compilateurs (les moins optimisants, en
fait) tiraient avantage d'un register.
Il s'agit d'un cas dans lequel le programmeur connaît le
contenu très particulier d'un flux de données (un fichier).
Mais le code était fait dans le but de montrer.A partir de là, vous êtes dans l'indéfini.
Pas du tout. L'indéfini ne s'y introduit que quand on essaie
à modifier l'objet, pas avant.
Oui. Il est effectivement utile de préciser que l'opération
d'affectation castée n'est pas en elle même indéfinie. Idem
quand je parle du cast "sauvage" comme d'un point clé. D'un
autre coté, prenons le cas de Maurice qui ratatine Josiane. Le
point-clé est-il quand il achète à Pépé le Biterrois le 357
magnum ou quand il appuie sur la gachette du soufflant pour
défourailler la belle ?
[...]Dans le cas d'un int const, ça m'étonnerait que tu trouves
un compilateur qui ne fait pas cette optimisation. Il faut
de toute façon que le compilateur puisse utiliser la valeur
même (et non la variable) dans des declarations du genre int
t[a].
J'en profite pour une question. Sur un compilateur Borland 5.6:
const size_t a = 32;
...
int t[a];
"test.c" : E2313 Constant expression required in function main
en ligne 10
(que a soit déclaré localement ou globalement).
Ce qui m'oblige à des #define
[...]
C'est en effet l'intention des auteurs de la norme C, au
départ. Selon le compilateur et le système, en revanche...
Sur beaucoup de systèmes, le volatile marche exactement
comme on s'y attendrait, tant qu'il n'y a qu'un seul
processeur (ou autre composant hardware) qui s'y accède. La
plupart des compilateurs que j'ai vu, en revanche,
n'insertent pas de barrière de mémoire, ce qui est
nécessaire dès qu'il y a plus d'une entité hardware qui y
accèdent.
Qu'est-ce qu'une barrière de mémoire ? Un truc qui locke
certains accès pour la durée d'une opération (comme la prise
d'un jeton) ?
[...]
Remarquez que la norme autorise à prendre l'adresses d'une
constante (au contraire d'un register par exemple).
Comment ça ? Tu peux prendre l'adresse de n'importe quel
objet. Même un objet déclaré régistre. Le mot clé régistre
(comme inline) n'est qu'une suggestion, et comme dit le note
dans la norme : « the hint can be ignored and in most
implementations it will be ignored if the address of the
object is take. »
Ben, ISO/IEC 9899:1999 (E), $6.7.1, note 100)
The implementation may treat any register declaration simply
as an auto declaration. However, whether or not addressable
storage is actually used, the address of any part of an object
declared with storage-class specifier register cannot be
computed, either explicitly (by use of the unary & operator as
discussed in 6.5.3.2) or implicitly (by converting an array
name to a pointer as discussed in 6.3.2.1). Thus, the only
operator that can be applied to an array declared with
storage-class specifier register is sizeof.
(Mais que je crois qu'en « most implementations »
aujourd'hui, la suggestion est systèmatiquement ignorée.
Sauf peut-être sur une architecture Intel, extrèmement
pauvre en règistres. Et même là, un bon compilateur saurait
mieux faire que le programmeur.)
C'est certain. J'ai déjà plusieurs fois donné *un* exemple
dans lequel certains compilateurs (les moins optimisants, en
fait) tiraient avantage d'un register.
Il s'agit d'un cas dans lequel le programmeur connaît le
contenu très particulier d'un flux de données (un fichier).
Mais le code était fait dans le but de montrer.
A partir de là, vous êtes dans l'indéfini.
Pas du tout. L'indéfini ne s'y introduit que quand on essaie
à modifier l'objet, pas avant.
Oui. Il est effectivement utile de préciser que l'opération
d'affectation castée n'est pas en elle même indéfinie. Idem
quand je parle du cast "sauvage" comme d'un point clé. D'un
autre coté, prenons le cas de Maurice qui ratatine Josiane. Le
point-clé est-il quand il achète à Pépé le Biterrois le 357
magnum ou quand il appuie sur la gachette du soufflant pour
défourailler la belle ?
[...]
Dans le cas d'un int const, ça m'étonnerait que tu trouves
un compilateur qui ne fait pas cette optimisation. Il faut
de toute façon que le compilateur puisse utiliser la valeur
même (et non la variable) dans des declarations du genre int
t[a].
J'en profite pour une question. Sur un compilateur Borland 5.6:
const size_t a = 32;
...
int t[a];
"test.c" : E2313 Constant expression required in function main
en ligne 10
(que a soit déclaré localement ou globalement).
Ce qui m'oblige à des #define
[...]C'est en effet l'intention des auteurs de la norme C, au
départ. Selon le compilateur et le système, en revanche...
Sur beaucoup de systèmes, le volatile marche exactement
comme on s'y attendrait, tant qu'il n'y a qu'un seul
processeur (ou autre composant hardware) qui s'y accède. La
plupart des compilateurs que j'ai vu, en revanche,
n'insertent pas de barrière de mémoire, ce qui est
nécessaire dès qu'il y a plus d'une entité hardware qui y
accèdent.
Qu'est-ce qu'une barrière de mémoire ? Un truc qui locke
certains accès pour la durée d'une opération (comme la prise
d'un jeton) ?
[...]Remarquez que la norme autorise à prendre l'adresses d'une
constante (au contraire d'un register par exemple).
Comment ça ? Tu peux prendre l'adresse de n'importe quel
objet. Même un objet déclaré régistre. Le mot clé régistre
(comme inline) n'est qu'une suggestion, et comme dit le note
dans la norme : « the hint can be ignored and in most
implementations it will be ignored if the address of the
object is take. »
Ben, ISO/IEC 9899:1999 (E), $6.7.1, note 100)
The implementation may treat any register declaration simply
as an auto declaration. However, whether or not addressable
storage is actually used, the address of any part of an object
declared with storage-class specifier register cannot be
computed, either explicitly (by use of the unary & operator as
discussed in 6.5.3.2) or implicitly (by converting an array
name to a pointer as discussed in 6.3.2.1). Thus, the only
operator that can be applied to an array declared with
storage-class specifier register is sizeof.
(Mais que je crois qu'en « most implementations »
aujourd'hui, la suggestion est systèmatiquement ignorée.
Sauf peut-être sur une architecture Intel, extrèmement
pauvre en règistres. Et même là, un bon compilateur saurait
mieux faire que le programmeur.)
C'est certain. J'ai déjà plusieurs fois donné *un* exemple
dans lequel certains compilateurs (les moins optimisants, en
fait) tiraient avantage d'un register.
Il s'agit d'un cas dans lequel le programmeur connaît le
contenu très particulier d'un flux de données (un fichier).
Mais le code était fait dans le but de montrer.A partir de là, vous êtes dans l'indéfini.
Pas du tout. L'indéfini ne s'y introduit que quand on essaie
à modifier l'objet, pas avant.
Oui. Il est effectivement utile de préciser que l'opération
d'affectation castée n'est pas en elle même indéfinie. Idem
quand je parle du cast "sauvage" comme d'un point clé. D'un
autre coté, prenons le cas de Maurice qui ratatine Josiane. Le
point-clé est-il quand il achète à Pépé le Biterrois le 357
magnum ou quand il appuie sur la gachette du soufflant pour
défourailler la belle ?
[...]Dans le cas d'un int const, ça m'étonnerait que tu trouves
un compilateur qui ne fait pas cette optimisation. Il faut
de toute façon que le compilateur puisse utiliser la valeur
même (et non la variable) dans des declarations du genre int
t[a].
J'en profite pour une question. Sur un compilateur Borland 5.6:
const size_t a = 32;
...
int t[a];
"test.c" : E2313 Constant expression required in function main
en ligne 10
(que a soit déclaré localement ou globalement).
Ce qui m'oblige à des #define
r = (int *) & a;
Au passage, en C++, par lisibilité, on lui préférera :
r = const_cast<int*>(&a);
r = (int *) & a;
Au passage, en C++, par lisibilité, on lui préférera :
r = const_cast<int*>(&a);
r = (int *) & a;
Au passage, en C++, par lisibilité, on lui préférera :
r = const_cast<int*>(&a);
Non. C'est une instruction machine qui fonctionne sur les
requêtes mémoire à peu près comme un fflush() fonctionne sur un
flux (sauf qu'à l'encontre de fflush(), elle est bien défini et
en lecture et en écriture).
[...]
J'en profite pour une question. Sur un compilateur Borland 5.6:
const size_t a = 32;
...
int t[a];
"test.c" : E2313 Constant expression required in function main
en ligne 10
(que a soit déclaré localement ou globalement).
Ce qui m'oblige à des #define
Est-ce que tu es certain d'avoir compiler en mode C++, et non en
mode C ? Parce que c'est bien illégal en C, mais ça a marché en
C++ depuis le départ. (Dans mon cas, le compilateur Zilog, circa
1989. Mais d'après mes souvenirs, c'était décrit marcher dans
TC++PL, première édition. Qui décrivait, entre autres, le mot
clé « overload », mais pas l'héritage multiple, sans parler des
templates ou des exceptions.)
Je confirme que c'est bien en C++ que Borland 5.6 m'envoie paître.
Au fond, d'après ça, et tes commentaires sur le register, je me
démande si tu es en train de faire du C ou du C++. Parce qu'il
s'agit de deux langages différents, et il faut bien décider de
faire un ou l'autre, et ne pas faire les deux à la fois (dans la
même unité de compilation). Et si c'est le C qui t'intéresse,
plus que le C++, tu trouveras d'avantage d'experts dans la
matière dans le groupe C.
J'admets que le C++ ne me passionne pas. De là à confondre... (OK, je
Non. C'est une instruction machine qui fonctionne sur les
requêtes mémoire à peu près comme un fflush() fonctionne sur un
flux (sauf qu'à l'encontre de fflush(), elle est bien défini et
en lecture et en écriture).
[...]
J'en profite pour une question. Sur un compilateur Borland 5.6:
const size_t a = 32;
...
int t[a];
"test.c" : E2313 Constant expression required in function main
en ligne 10
(que a soit déclaré localement ou globalement).
Ce qui m'oblige à des #define
Est-ce que tu es certain d'avoir compiler en mode C++, et non en
mode C ? Parce que c'est bien illégal en C, mais ça a marché en
C++ depuis le départ. (Dans mon cas, le compilateur Zilog, circa
1989. Mais d'après mes souvenirs, c'était décrit marcher dans
TC++PL, première édition. Qui décrivait, entre autres, le mot
clé « overload », mais pas l'héritage multiple, sans parler des
templates ou des exceptions.)
Je confirme que c'est bien en C++ que Borland 5.6 m'envoie paître.
Au fond, d'après ça, et tes commentaires sur le register, je me
démande si tu es en train de faire du C ou du C++. Parce qu'il
s'agit de deux langages différents, et il faut bien décider de
faire un ou l'autre, et ne pas faire les deux à la fois (dans la
même unité de compilation). Et si c'est le C qui t'intéresse,
plus que le C++, tu trouveras d'avantage d'experts dans la
matière dans le groupe C.
J'admets que le C++ ne me passionne pas. De là à confondre... (OK, je
Non. C'est une instruction machine qui fonctionne sur les
requêtes mémoire à peu près comme un fflush() fonctionne sur un
flux (sauf qu'à l'encontre de fflush(), elle est bien défini et
en lecture et en écriture).
[...]
J'en profite pour une question. Sur un compilateur Borland 5.6:
const size_t a = 32;
...
int t[a];
"test.c" : E2313 Constant expression required in function main
en ligne 10
(que a soit déclaré localement ou globalement).
Ce qui m'oblige à des #define
Est-ce que tu es certain d'avoir compiler en mode C++, et non en
mode C ? Parce que c'est bien illégal en C, mais ça a marché en
C++ depuis le départ. (Dans mon cas, le compilateur Zilog, circa
1989. Mais d'après mes souvenirs, c'était décrit marcher dans
TC++PL, première édition. Qui décrivait, entre autres, le mot
clé « overload », mais pas l'héritage multiple, sans parler des
templates ou des exceptions.)
Je confirme que c'est bien en C++ que Borland 5.6 m'envoie paître.
Au fond, d'après ça, et tes commentaires sur le register, je me
démande si tu es en train de faire du C ou du C++. Parce qu'il
s'agit de deux langages différents, et il faut bien décider de
faire un ou l'autre, et ne pas faire les deux à la fois (dans la
même unité de compilation). Et si c'est le C qui t'intéresse,
plus que le C++, tu trouveras d'avantage d'experts dans la
matière dans le groupe C.
J'admets que le C++ ne me passionne pas. De là à confondre... (OK, je
[...]Non. C'est une instruction machine qui fonctionne sur les
requêtes mémoire à peu près comme un fflush() fonctionne sur
un flux (sauf qu'à l'encontre de fflush(), elle est bien
défini et en lecture et en écriture).
[...]
J'aurais dû m'en douter, avec un meilleur anglais: SFENCE,
MFENCE, LFENCE, etc...
J'en profite pour une question. Sur un compilateur Borland 5.6:
const size_t a = 32;
...
int t[a];
"test.c" : E2313 Constant expression required in function main
en ligne 10
(que a soit déclaré localement ou globalement). Ce qui
m'oblige à des #define
Est-ce que tu es certain d'avoir compiler en mode C++, et
non en mode C ? Parce que c'est bien illégal en C, mais ça a
marché en C++ depuis le départ. (Dans mon cas, le
compilateur Zilog, circa 1989. Mais d'après mes souvenirs,
c'était décrit marcher dans TC++PL, première édition. Qui
décrivait, entre autres, le mot clé « overload », mais pas
l'héritage multiple, sans parler des templates ou des
exceptions.)
Je confirme que c'est bien en C++ que Borland 5.6 m'envoie paître.
Ayant parfois fait l'erreur inverse avec gcc à cause d'un IDE
qui ajoutait un -c c++, je vérifie souvent, et dans le sens C
pour du C++, l'erreur est quand même vite vue.Au fond, d'après ça, et tes commentaires sur le register, je
me démande si tu es en train de faire du C ou du C++. Parce
qu'il s'agit de deux langages différents, et il faut bien
décider de faire un ou l'autre, et ne pas faire les deux à
la fois (dans la même unité de compilation). Et si c'est le
C qui t'intéresse, plus que le C++, tu trouveras d'avantage
d'experts dans la matière dans le groupe C.
J'admets que le C++ ne me passionne pas. De là à confondre...
(OK, je me suis trompé de norme pour la citation sur la prise
d'adresse d'un register).
Je ne souhaite pas vraiment développer des classe, et surtout
pas des hiérarchies de classes. En revanche je les utilise. Je
ne pense pas être unique à vouloir utiliser C++Builder par
exemple, et à être incapable d'écrire une bibliothèque de ce
calibre.
Donc, je me contente d'utiliser le plus proprement possible en
les complètant les classes dérivées mises à ma disposition,
voire en créer de très simples. Pour d'autres raisons, je
m'intéresse au C pur et dur, mais je dois dire que je me fiche
un peu de C99 au profit d'un tronc commun C89/C++98. Un
exemple: je caste les pointeurs void.
[...]
Non. C'est une instruction machine qui fonctionne sur les
requêtes mémoire à peu près comme un fflush() fonctionne sur
un flux (sauf qu'à l'encontre de fflush(), elle est bien
défini et en lecture et en écriture).
[...]
J'aurais dû m'en douter, avec un meilleur anglais: SFENCE,
MFENCE, LFENCE, etc...
J'en profite pour une question. Sur un compilateur Borland 5.6:
const size_t a = 32;
...
int t[a];
"test.c" : E2313 Constant expression required in function main
en ligne 10
(que a soit déclaré localement ou globalement). Ce qui
m'oblige à des #define
Est-ce que tu es certain d'avoir compiler en mode C++, et
non en mode C ? Parce que c'est bien illégal en C, mais ça a
marché en C++ depuis le départ. (Dans mon cas, le
compilateur Zilog, circa 1989. Mais d'après mes souvenirs,
c'était décrit marcher dans TC++PL, première édition. Qui
décrivait, entre autres, le mot clé « overload », mais pas
l'héritage multiple, sans parler des templates ou des
exceptions.)
Je confirme que c'est bien en C++ que Borland 5.6 m'envoie paître.
Ayant parfois fait l'erreur inverse avec gcc à cause d'un IDE
qui ajoutait un -c c++, je vérifie souvent, et dans le sens C
pour du C++, l'erreur est quand même vite vue.
Au fond, d'après ça, et tes commentaires sur le register, je
me démande si tu es en train de faire du C ou du C++. Parce
qu'il s'agit de deux langages différents, et il faut bien
décider de faire un ou l'autre, et ne pas faire les deux à
la fois (dans la même unité de compilation). Et si c'est le
C qui t'intéresse, plus que le C++, tu trouveras d'avantage
d'experts dans la matière dans le groupe C.
J'admets que le C++ ne me passionne pas. De là à confondre...
(OK, je me suis trompé de norme pour la citation sur la prise
d'adresse d'un register).
Je ne souhaite pas vraiment développer des classe, et surtout
pas des hiérarchies de classes. En revanche je les utilise. Je
ne pense pas être unique à vouloir utiliser C++Builder par
exemple, et à être incapable d'écrire une bibliothèque de ce
calibre.
Donc, je me contente d'utiliser le plus proprement possible en
les complètant les classes dérivées mises à ma disposition,
voire en créer de très simples. Pour d'autres raisons, je
m'intéresse au C pur et dur, mais je dois dire que je me fiche
un peu de C99 au profit d'un tronc commun C89/C++98. Un
exemple: je caste les pointeurs void.
[...]Non. C'est une instruction machine qui fonctionne sur les
requêtes mémoire à peu près comme un fflush() fonctionne sur
un flux (sauf qu'à l'encontre de fflush(), elle est bien
défini et en lecture et en écriture).
[...]
J'aurais dû m'en douter, avec un meilleur anglais: SFENCE,
MFENCE, LFENCE, etc...
J'en profite pour une question. Sur un compilateur Borland 5.6:
const size_t a = 32;
...
int t[a];
"test.c" : E2313 Constant expression required in function main
en ligne 10
(que a soit déclaré localement ou globalement). Ce qui
m'oblige à des #define
Est-ce que tu es certain d'avoir compiler en mode C++, et
non en mode C ? Parce que c'est bien illégal en C, mais ça a
marché en C++ depuis le départ. (Dans mon cas, le
compilateur Zilog, circa 1989. Mais d'après mes souvenirs,
c'était décrit marcher dans TC++PL, première édition. Qui
décrivait, entre autres, le mot clé « overload », mais pas
l'héritage multiple, sans parler des templates ou des
exceptions.)
Je confirme que c'est bien en C++ que Borland 5.6 m'envoie paître.
Ayant parfois fait l'erreur inverse avec gcc à cause d'un IDE
qui ajoutait un -c c++, je vérifie souvent, et dans le sens C
pour du C++, l'erreur est quand même vite vue.Au fond, d'après ça, et tes commentaires sur le register, je
me démande si tu es en train de faire du C ou du C++. Parce
qu'il s'agit de deux langages différents, et il faut bien
décider de faire un ou l'autre, et ne pas faire les deux à
la fois (dans la même unité de compilation). Et si c'est le
C qui t'intéresse, plus que le C++, tu trouveras d'avantage
d'experts dans la matière dans le groupe C.
J'admets que le C++ ne me passionne pas. De là à confondre...
(OK, je me suis trompé de norme pour la citation sur la prise
d'adresse d'un register).
Je ne souhaite pas vraiment développer des classe, et surtout
pas des hiérarchies de classes. En revanche je les utilise. Je
ne pense pas être unique à vouloir utiliser C++Builder par
exemple, et à être incapable d'écrire une bibliothèque de ce
calibre.
Donc, je me contente d'utiliser le plus proprement possible en
les complètant les classes dérivées mises à ma disposition,
voire en créer de très simples. Pour d'autres raisons, je
m'intéresse au C pur et dur, mais je dois dire que je me fiche
un peu de C99 au profit d'un tronc commun C89/C++98. Un
exemple: je caste les pointeurs void.
Je me démandé aussi parce que dans le message d'erreur, il est
question d'un fichier source « test.c ». Or, tous les
compilateurs que j'utilise d'habitude vont traiter une source
dont le nom se termine en .c comme une source C, et non comme
une source C++. Par défaut, en tout cas ; il y a en général une
option (/Tp pour le compilateur Microsoft) qui le force à le
traiter comme C++.
Honte à moi. Shame on me. :D
Je me démandé aussi parce que dans le message d'erreur, il est
question d'un fichier source « test.c ». Or, tous les
compilateurs que j'utilise d'habitude vont traiter une source
dont le nom se termine en .c comme une source C, et non comme
une source C++. Par défaut, en tout cas ; il y a en général une
option (/Tp pour le compilateur Microsoft) qui le force à le
traiter comme C++.
Honte à moi. Shame on me. :D
Je me démandé aussi parce que dans le message d'erreur, il est
question d'un fichier source « test.c ». Or, tous les
compilateurs que j'utilise d'habitude vont traiter une source
dont le nom se termine en .c comme une source C, et non comme
une source C++. Par défaut, en tout cas ; il y a en général une
option (/Tp pour le compilateur Microsoft) qui le force à le
traiter comme C++.
Honte à moi. Shame on me. :D