58 votes

"Std :: size_t" a-t-il un sens en C ++?

Dans certains code que j'ai hérité, je vois l'utilisation fréquente de l' size_t avec l' std de l'espace de noms de qualification. Par exemple:

std::size_t n = sizeof( long );

Il compile et fonctionne très bien, bien sûr. Mais il semble comme une mauvaise pratique pour moi (peut-être reportées de C?).

N'est-il pas vrai que l' size_t est intégré dans le C++, et donc dans l'espace de noms global? Est un fichier d'en-tête comprennent nécessaires à l'utilisation de size_t en C++?

Une autre façon de poser cette question est, serait le programme suivant (avec pas inclut) peut s'attendre à compiler sur tous les compilateurs C++?

size_t foo()
{
    return sizeof( long );
}

130voto

Johannes Schaub - litb Points 256113

Il semble y avoir confusion entre les stackoverflow foule concernant ce

::size_t est défini dans la compatibilité descendante de l'en-tête stddef.h . Il fait partie de l' ANSI/ISO C et ISO C++ depuis leur tout début. Chaque implémentation C++ est livré avec stddef.h (compatibilité) et cstddef où seul le dernier définit std::size_t et pas nécessairement ::size_t. Voir l'Annexe D de la Norme C++.

41voto

Don Wakefield Points 4684

Le paragraphe 4 de l’article 17.4.1.2 de la norme C ++ stipule que:

"Dans la bibliothèque standard C ++, cependant, les déclarations et les définitions (à l'exception des noms définis en tant que macros en C) se trouvent dans la portée de l'espace de noms (3.3.5) de l'espace de noms std."

Cela inclut les éléments trouvés dans les en-têtes du modèle cname , y compris cstddef , qui définit size_t.

Donc std :: size_t est en fait correct.

13voto

fizzer Points 8193

Vous pouvez obtenir size_t dans l'espace de noms global en incluant, par exemple, <stddef.h> au lieu de <cstddef> . Je ne vois aucun avantage évident et cette fonctionnalité est déconseillée.

4voto

ypnos Points 21940

size_t est pas construite en C++. Et il n'est pas défini par défaut. Celle-ci n'est pas compilé avec GCC:

int main(int argc, char** argv) {
size_t size;
}

Cela dit, size_t est la partie de la norme POSIX et si vous utilisez uniquement des choses de base comme <cstdlib>, vous allez probablement finir par l'avoir défini.

On pourrait dire que std::size_t est le C++ équivalent de size_t. Comme Brian l'a souligné, std:: est utilisé comme espace de noms pour éviter de définir des variables globales qui ne convient pas à tout le monde. C'est comme std::string, ce qui pourrait également avoir été définie dans l'espace de noms racine.

4voto

mloskot Points 13971
std::size_t n = sizeof( long );

En fait, vous n'avez pas demandé précisément ce qui semble être une mauvaise pratique int ci-dessus. L'utilisation de size_t, de qualification avec l'espace de noms std,...

Comme le C++ Standard dit (18.1), size_t est un type défini dans l'en-tête standard . Je te suggère de supprimer toutes les pensées et les impressions à propos d'une possible succession de langage C. C++ est un langage différent et il est préférable de le considérer comme tel. Il a sa propre bibliothèque standard et tous les éléments de C++ de la Bibliothèque Standard sont définies dans l'espace de noms std. Toutefois, il est possible d'utiliser des éléments de la Bibliothèque Standard C dans un programme C++.

J'avais envisager de l'inclure comme un sale hack. La Norme C++ dispose que le contenu des en-têtes est le même ou est basée sur les en-têtes de la Bibliothèque C Standard, mais dans nombre de cas, des changements ont été appliqués. En d'autres mots, c'est pas un copier / coller d'en-têtes C en C++ en-têtes.

size_t est pas un type en C++. C'est un type défini de spécifier quel type de type intégral est utilisé comme un type de retour sizeof() de l'opérateur, le fait qu'un type de retour de sizeof() est définie par l'implémentation, de sorte que le C++ Standard unifie par la définition d'un size_t.

serait le programme suivant (sans comprend) être prévu pour compiler sur tous les compilateurs C++?

size_t foo()
{
    return sizeof( long );
}

La Norme C++ dit (1.4):

Les noms définis dans la bibliothèque de l'espace de noms de la portée (7.3). En C ++ une unité de traduction (2.1) obtient l'accès à ces noms, y compris la norme appropriée de la bibliothèque de l'en-tête (16.2).

Le size_t est un nom défini dans l'espace de noms std, de sorte que chaque programme qui utilise ce nom doit inclure l'en-tête correspondant, dans ce cas.

Ensuite, le chapitre 3.7.3 dit:

*Cependant, en se référant à std std::bad_alloc, et std::size_t est mal formé, à moins que le nom a été déclarée en incluant l'en-tête approprié.*

Étant donné que, d'un programme à l'aide de size_t, mais pas y compris en-tête est mal formé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X