 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
hackervalley Guest
|
Posted: Sat Apr 10, 2004 11:03 pm Post subject: [size_t] |
|
|
Bonjour,
Dans des lignes de code, je vois size_t.
Je pense que c'est un typedef de ... ?
Est - il judicieux d'utiliser ce type ou faut - il définir ces propres
types ?
Quelques explications sur size_t m'aideraient beaucoup.
Merci
hackervalley
http://hackervalley.free.fr
|
|
| Back to top |
|
 |
Régis Troadec Guest
|
Posted: Sun Apr 11, 2004 12:55 am Post subject: Re: [size_t] |
|
|
"hackervalley" <hackervalley (AT) free (DOT) fr> a écrit dans le message de
news:407852d2$0$26421$626a14ce (AT) news (DOT) free.fr...
Bonjour
| Quote: |
Dans des lignes de code, je vois size_t.
|
C'est un type intégral (entier) non signé provenant du langage C, qui est en
fait le type du resultat provenant de l'operateur sizeof. Il est défini en
C++ dans l'en-tête <cstddef> (<stddef.h>). Mais tu le retrouveras aussi dans
les en-tetes herites de la bibliotheque standard C, les <cmachin>.
| Quote: | Je pense que c'est un typedef de ... ?
|
On ne peut pas l'affirmer, ca depend de ton implementation, meme si il y de
grandes chances que ce soit effectivement un typedef du genre typedef
unsigned qqchose....
Il existe une macro SIZE_MAX dans <cstdint> (encore un heritage du C) qui
donne la valeur max que peut prendre un size_t (65535 au minimum). Cette
macro est definie pour une implementattion C++ si __STDC_LIMIT_MACROS est
defini avant l'inclusion de <cstdint>
| Quote: |
Est - il judicieux d'utiliser ce type ou faut - il définir ces propres
types ?
|
Je pense que oui .
En tout cas, on le trouve a peu pres partout.
Regis
|
|
| Back to top |
|
 |
Pierre Maurette Guest
|
Posted: Sun Apr 11, 2004 7:01 am Post subject: Re: [size_t] |
|
|
"Régis Troadec" <regt (AT) wanadoo (DOT) fr> typa:
| Quote: | "hackervalley" <hackervalley (AT) free (DOT) fr> a écrit
[...]
Je pense que c'est un typedef de ... ?
On ne peut pas l'affirmer, ca depend de ton implementation, meme si il y de
grandes chances que ce soit effectivement un typedef du genre typedef
unsigned qqchose....
La norme (C99, alors que c'est C90 qui s'applique en C++ à ce sujet il |
me semble) définit size_t comme un "type", avant de définir des
macros. Ne peut-on pas en conclure que size_t est un typedef, étant
entendu qu'il ne peut s'agir d'un type natif puisque défini dans
stddef.h. Y a-t-il un autre moyen que le typedef ou la macro? Une
implémentation qui définirait:
#define size_t unsigned int
serait-elle conforme?
| Quote: | Il existe une macro SIZE_MAX dans <cstdint> (encore un heritage du C) qui
donne la valeur max que peut prendre un size_t (65535 au minimum). Cette
macro est definie pour une implementattion C++ si __STDC_LIMIT_MACROS est
defini avant l'inclusion de <cstdint
Je me demande si c'est imposé par la norme, dans laquelle je ne vois |
pas de trace d'un __STDC_LIMIT_MACROS (C++9 .
- Ne parlons pas de VC++, il n'y a même pas de "*stdint*" dans les
version 6 et 7.1, et SIZE_MAX semble inconnu.
- gcc (sous Windows) se comporte comme vous le décrivez, avec un
SIZE_MAX à 4294967295 (FFFFFFFFh).
- Chez Borland, je trouve dans stdint.h (inclus par cstdint),
compatible C99 mais utilisé par C++ 5.6 :
/* stdint.h
Integer types - c99 7.18
*/
/*
* C/C++ Run Time Library - Version 11.0
*
* Copyright (c) 2002 by Borland Software Corporation
* All Rights Reserved.
*
*/
#ifndef __STDINT_H
#define __STDINT_H
[...]
/* 7.18.3 Limits of other integer types */
#define PTRDIFF_MIN ((int32_t) -65536)
#define PTRDIFF_MAX ((int32_t) 65535)
#ifdef __STDC_LIMIT_MACROS
#define SIG_ATOMIC_MIN INT32_MIN
#define SIG_ATOMIC_MAX INT32_MAX
#endif
#define SIZE_MAX 65535
[...]
</stdint.h>
Donc, SIZE_MAX n'est pas concerné par la macro __STDC_LIMIT_MACROS.
Est-ce une erreur de Borland ?
| Quote: | Est - il judicieux d'utiliser ce type ou faut - il définir ces propres
types ?
Je pense que oui .
En tout cas, on le trouve a peu pres partout.
Je serais plus affirmatif. Le type sous-jacent à size_t peut |
réellement varier, même sur la une plateforme donnée. Et puis quel
intêret à ne pas l'utiliser?
En fait, le plus souvent, on va utiliser sizeof() en paramètre de
fonction de type size_t, sans variable intermédiaire.
Pierre
|
|
| Back to top |
|
 |
hackervalley Guest
|
Posted: Sun Apr 11, 2004 5:17 pm Post subject: Re: [size_t] |
|
|
Merci, pour ces explications.
hackervalley
|
|
| Back to top |
|
 |
Régis Troadec Guest
|
Posted: Mon Apr 12, 2004 5:03 pm Post subject: Re: [size_t] |
|
|
"Pierre Maurette" <maurette.pierreATfree.fr@> a écrit dans le message de
news:72oh70hr1fdkj33bpgitj10p61b77r1tch (AT) 4ax (DOT) com...
Salut,
| Quote: | Il existe une macro SIZE_MAX dans <cstdint> (encore un heritage du C) qui
donne la valeur max que peut prendre un size_t (65535 au minimum). Cette
macro est definie pour une implementattion C++ si __STDC_LIMIT_MACROS est
defini avant l'inclusion de <cstdint
|
C'est en fait une grosse connerie ce que j'ai ecris la.
ete repris
en C++(9 , he ben non, pas de <cstdint>. Ce qui est normal, c'est un
en-tete
de C99.
| Quote: | Je me demande si c'est imposé par la norme, dans laquelle je ne vois
pas de trace d'un __STDC_LIMIT_MACROS (C++9 .
|
C'est dans la C99 (§7.18.3), en note de bas de page, qu'il est dit que les
macros ptrdiff_t, sig_atomic_t, size_t, et wchar_t de <stdint.h> ne doivent
etre definies pour les implementations C++ que si la macro
__STDC_LIMIT_MACROS est definie avant l'inclusion de <stdint.h>. Je n'ai pas
vu non plus cette macro dans ma draft de C++98, et je ne pense pas que ce
soit imposé par la norme.
Mais en tout cas, chez moi, ca fonctionne comme cela avec gcc.
Pour voir :
#include <iostream>
// define a commenter/decommenter
// ne devrait pas marcher (SIZE_MAX non reconnu)
// si c'est commente
// #define __STDC_LIMIT_MACROS
extern "C"
{
#include <stdint.h>
}
int main()
{
std::cout << SIZE_MAX << 'n';
return 0;
}
Regis
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Mon Apr 12, 2004 11:38 pm Post subject: Re: [size_t] |
|
|
"Régis Troadec" <regt (AT) wanadoo (DOT) fr> writes:
| Quote: | Je pense que c'est un typedef de ... ?
On ne peut pas l'affirmer, ca depend de ton implementation, meme si il y de
grandes chances que ce soit effectivement un typedef du genre typedef
unsigned qqchose....
|
Non seulement, il y a de grandes changes de quelque chose, mais la
définition de C++ demande que ce soit un typedef d'unsigned quelque chose.
| Quote: | Il existe une macro SIZE_MAX
|
std::numeric_limits<std::size_t>::max().
| Quote: | dans <cstdint> (encore un heritage du C) qui
|
Quelle version de C++ demande ça ?
-- Gaby
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Apr 13, 2004 1:20 pm Post subject: Re: [size_t] |
|
|
Pierre Maurette <maurette.pierreATfree.fr@> wrote
| Quote: | "Régis Troadec" <regt (AT) wanadoo (DOT) fr> typa:
"hackervalley" <hackervalley (AT) free (DOT) fr> a écrit
[...]
Je pense que c'est un typedef de ... ?
On ne peut pas l'affirmer, ca depend de ton implementation, meme si
il y de grandes chances que ce soit effectivement un typedef du genre
typedef unsigned qqchose....
La norme (C99, alors que c'est C90 qui s'applique en C++ à ce sujet il
me semble) définit size_t comme un "type", avant de définir des
macros. Ne peut-on pas en conclure que size_t est un typedef, étant
entendu qu'il ne peut s'agir d'un type natif puisque défini dans
stddef.h. Y a-t-il un autre moyen que le typedef ou la macro? Une
implémentation qui définirait: #define size_t unsigned int serait-elle
conforme?
|
La norme C90 définit aussi size_t comme un « type ». Donc, pas un macro.
La norme C permet bien à des fonctions à être remplacée par des macros,
mais je ne crois pas que cette liberté s'étend à des types. De toute
façon, même si elle s'y étendait, tu as droit à faire un #undef size_t,
et l'utiliser le symbol sans avoir recours au macro.
La norme C90 définit size_t comme étant un type entier non-signé. C-à-d
(en C90), un de : unsigned char, unsigned short, unsigned int ou
unsigned long. C90 n'a aucun autre moyen à définir size_t comme étant un
de ces types que avec typedef.
| Quote: | Il existe une macro SIZE_MAX dans <cstdint> (encore un heritage du C)
qui donne la valeur max que peut prendre un size_t (65535 au
minimum).
|
Il n'existe pas d'en-tête <cstdint> en C++. Il n'existait pas d'en-tête
<stdint.h> en C90. En C++ moderne, si tu veux la valeur maximum d'un
size_t, tu peux faire std::numeric_limits< size_t >::max() (mais ce
n'est pas une « expression entière constante »). En C90 (et en C++ plus
ancien), tu dois faire « (size_t)( -1 ) ».
| Quote: | Cette macro est definie pour une implementattion C++ si
__STDC_LIMIT_MACROS est defini avant l'inclusion de <cstdint
|
Selon une note dans la norme C99. Ça part d'une bonne intention (je
crois), mais 1) les notes ne sont pas normatives, et 2) rien dans C99
n'est normative pour C++.
Enfin, c'est toujours une bonne indication pour une implémentation de
qualité.
| Quote: | Je me demande si c'est imposé par la norme, dans laquelle je ne vois
pas de trace d'un __STDC_LIMIT_MACROS (C++9 .
- Ne parlons pas de VC++, il n'y a même pas de "*stdint*" dans les
version 6 et 7.1, et SIZE_MAX semble inconnu.
|
Il n'y a pas de
[...]
| Quote: | Est - il judicieux d'utiliser ce type ou faut - il définir ces
propres types ?
Je pense que oui . En tout cas, on le trouve a peu pres partout.
Je serais plus affirmatif. Le type sous-jacent à size_t peut
réellement varier, même sur la une plateforme donnée. Et puis quel
intêret à ne pas l'utiliser?
|
L'intérêt principal à ne pas l'utiliser, c'est que c'est un type
non-signé, et en C++, les types non-signés ont des comportements un peu
bizarre, et surtout se melange mal avec les types signés.
| Quote: | En fait, le plus souvent, on va utiliser sizeof() en paramètre de
fonction de type size_t, sans variable intermédiaire.
|
En fait, le plus souvent, on se trouve obligé à l'utiliser par des
classes de la bibliothèque standard. Mélanger les types pose parfois des
problèmes, et dans la mésure du possible, c'est mieux de rester avec un
seul type.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Régis Troadec Guest
|
Posted: Tue Apr 13, 2004 1:53 pm Post subject: Re: [size_t] |
|
|
"Gabriel Dos Reis" <gdr (AT) integrable-solutions (DOT) net> a écrit dans le message de
news:m3brlw22ct.fsf (AT) uniton (DOT) integrable-solutions.net...
Salut,
| Quote: | "Régis Troadec" <regt (AT) wanadoo (DOT) fr> writes:
| > Je pense que c'est un typedef de ... ?
|
| On ne peut pas l'affirmer, ca depend de ton implementation, meme si il y
de
| grandes chances que ce soit effectivement un typedef du genre typedef
| unsigned qqchose....
Non seulement, il y a de grandes changes de quelque chose, mais la
définition de C++ demande que ce soit un typedef d'unsigned quelque chose.
| Il existe une macro SIZE_MAX
| dans <cstdint> (encore un heritage du C) qui
std::numeric_limits<std::size_t>::max().
Quelle version de C++ demande ça ?
|
Aucune, entrelac avec le C, voir ma reponse a Pierre.
Regis
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|