OVH Cloud OVH Cloud

[size_t]

7 réponses
Avatar
hackervalley
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

7 réponses

Avatar
Régis Troadec
"hackervalley" a écrit dans le message de
news:407852d2$0$26421$
Bonjour,


Bonjour


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>.

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>


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

Avatar
Pierre Maurette
"Régis Troadec" typa:
"hackervalley" 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?

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++98).
- 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>
/* 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 ?

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.

Regis


Pierre


Avatar
hackervalley
Merci, pour ces explications.

hackervalley
Avatar
Régis Troadec
"Pierre Maurette" <maurette.pierreATfree.fr@> a écrit dans le message de
news:

Salut,

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. <stdint.h> n'a pas
ete repris
en C++(98), he ben non, pas de <cstdint>. Ce qui est normal, c'est un
en-tete
de C99.

Je me demande si c'est imposé par la norme, dans laquelle je ne vois
pas de trace d'un __STDC_LIMIT_MACROS (C++98).


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


Avatar
Gabriel Dos Reis
"Régis Troadec" 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

std::numeric_limits<std::size_t>::max().

| dans <cstdint> (encore un heritage du C) qui

Quelle version de C++ demande ça ?

-- Gaby
Avatar
kanze
Pierre Maurette <maurette.pierreATfree.fr@> wrote in message
news:...
"Régis Troadec" typa:
"hackervalley" 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.

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 ) ».

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é.

Je me demande si c'est imposé par la norme, dans laquelle je ne vois
pas de trace d'un __STDC_LIMIT_MACROS (C++98).

- 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 <stdint.h> ni de <cstdint> en C++. Encore, en tout cas.

[...]
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.

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:
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



Avatar
Régis Troadec
"Gabriel Dos Reis" a écrit dans le message de
news:

Salut,

"Régis Troadec" 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

-- Gaby