size_t n'est pas forcement assez grand pour contenir la valeur d'un pointeur
Mais size_t est assez grand pour contenir la taille de n'importe quel objet. Et l'alignment est forcement plus petit ou égal à la taille maximale d'un objet.
size_t n'est pas forcement assez grand pour contenir la valeur d'un
pointeur
Mais size_t est assez grand pour contenir la taille de n'importe quel objet.
Et l'alignment est forcement plus petit ou égal à la taille maximale
d'un objet.
size_t n'est pas forcement assez grand pour contenir la valeur d'un pointeur
Mais size_t est assez grand pour contenir la taille de n'importe quel objet. Et l'alignment est forcement plus petit ou égal à la taille maximale d'un objet.
James Kanze
Mathias Gaunard wrote:
size_t n'est pas forcement assez grand pour contenir la valeur d'un pointeur
Mais size_t est assez grand pour contenir la taille de n'importe quel obj et. Et l'alignment est forcement plus petit ou égal à la taille maximale d'un objet.
Oui, mais selon la norme : « A pointer can be explicitly converted to any integral type large enough to hold it. ». En C++, une telle conversion doit être détectée par le compilateur ; en C, c'est un comportement indéfini.
Je me démande pourquoi la différence. Dans ce cas-ci, le but du comportement indéfini en C, c'est clairement de permettre à l'implémentation de le définir d'une façon utile pour cette implémentation. Historiquement, des compilateurs C l'ont accepté, et actuellement, gcc n'en génère qu'un avertissement, et Sun cc l'accepte sans rien dire (tandis que les deux compilateurs le rejettent en C++, au moins avec leurs options par défaut).
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Mathias Gaunard wrote:
size_t n'est pas forcement assez grand pour contenir la valeur d'un
pointeur
Mais size_t est assez grand pour contenir la taille de n'importe quel obj et.
Et l'alignment est forcement plus petit ou égal à la taille maximale
d'un objet.
Oui, mais selon la norme : « A pointer can be explicitly
converted to any integral type large enough to hold it. ». En
C++, une telle conversion doit être détectée par le
compilateur ; en C, c'est un comportement indéfini.
Je me démande pourquoi la différence. Dans ce cas-ci, le but du
comportement indéfini en C, c'est clairement de permettre à
l'implémentation de le définir d'une façon utile pour cette
implémentation. Historiquement, des compilateurs C l'ont
accepté, et actuellement, gcc n'en génère qu'un avertissement,
et Sun cc l'accepte sans rien dire (tandis que les deux
compilateurs le rejettent en C++, au moins avec leurs options
par défaut).
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
size_t n'est pas forcement assez grand pour contenir la valeur d'un pointeur
Mais size_t est assez grand pour contenir la taille de n'importe quel obj et. Et l'alignment est forcement plus petit ou égal à la taille maximale d'un objet.
Oui, mais selon la norme : « A pointer can be explicitly converted to any integral type large enough to hold it. ». En C++, une telle conversion doit être détectée par le compilateur ; en C, c'est un comportement indéfini.
Je me démande pourquoi la différence. Dans ce cas-ci, le but du comportement indéfini en C, c'est clairement de permettre à l'implémentation de le définir d'une façon utile pour cette implémentation. Historiquement, des compilateurs C l'ont accepté, et actuellement, gcc n'en génère qu'un avertissement, et Sun cc l'accepte sans rien dire (tandis que les deux compilateurs le rejettent en C++, au moins avec leurs options par défaut).
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34