¿Cuáles son las diferencias entre size_ty std::size_ten términos de dónde se declaran, cuándo deben usarse y otras características diferenciadoras?
¿Cuáles son las diferencias entre size_ty std::size_ten términos de dónde se declaran, cuándo deben usarse y otras características diferenciadoras?
Respuestas:
C size_ty C ++ std::size_tson los mismos.
En C, se define en <stddef.h>y en C ++, se define en <cstddef>cuyo contenido es el mismo que el encabezado C (consulte la cita a continuación). Se define como un tipo entero sin signo del resultado del operador sizeof .
C Standard dice en §17.7 / 2,
size_t, que es el tipo entero sin signo del resultado del operador sizeof
Y el estándar C ++ dice (sobre el cstddefencabezado) en §18.1 / 3,
El contenido es el mismo que el encabezado de la biblioteca estándar C, con los siguientes cambios .
Entonces sí, ambos son iguales; La única diferencia es que C ++ define size_ten el stdespacio de nombres.
Tenga en cuenta también que la línea anterior también dice "con los siguientes cambios" a los que no se refiere size_t. Se refiere más bien a las nuevas adiciones (en su mayoría) realizadas por C ++ en el lenguaje (no presente en C) que también se definen en el mismo encabezado.
Wikipedia tiene muy buena información sobre el rango y el tamaño de almacenamiento de size_t:
Rango y tamaño de almacenamiento de size_t
El tipo real de size_t depende de la plataforma ; un error común es asumir que size_t es lo mismo que unsigned int, lo que puede conducir a errores de programación, [3] [4] al pasar de una arquitectura de 32 a 64 bits, por ejemplo.
Según el estándar ISO C 1999 (C99), size_t es un tipo entero sin signo de al menos 16 bits.
Y el resto lo puedes leer desde esta página en wikipedia.
size_tsin using namespace std;o using std::size_t;. Sin embargo, la mayoría de los compiladores lo permiten, y el Estándar específicamente les permite permitirlo (§D.5 / 3).
<cstddef>puede o no declararse ::size_t, por lo que no puede confiar en que esté allí o esté ausente, a menos que incluya específicamente <stddef.h>u otro encabezado de la biblioteca C que garantice su declaración.
::size_testá presente <stddef.h>, por ejemplo , en , por lo que no siempre necesitas calificarlo std::.
Desde C ++ 03 "17.4.3.1.4 Tipos":
Para cada tipo T de la biblioteca C estándar (nota 169), los tipos :: T y std :: T están reservados para la implementación y, cuando se define, :: T será idéntico a std :: T.
Y nota 169:
Estos tipos son clock_t, div_t, FILE, fpos_t, lconv, ldiv_t, mbstate_t, ptrdiff_t, sig_atomic_t, size_t, time_t, tm, va_list, wctrans_t, wctype_t y wint_t.
std::Tvariantes que se definen?
#include <stddef.h>luego std::size_tpuede o no estar disponible. Si #include <cstddef>entonces std::size_testá disponible, pero size_tpodría no estarlo.
std::y el párrafo dice que también puede definirlos en el espacio de nombres de nivel superior y, si lo hace, debe definirlos de manera idéntica std::y en el nivel superior. La mayoría de los compiladores solo incluyen el encabezado C e importan los nombres std::, por lo que los símbolos terminan definidos en ambos.
std::variantes de identificadores que provienen de la orilla C. Me quedo con <xxxxx.h>los encabezados C estándar: nunca ha sido un problema. Por lo tanto, me gustaría usar <stddef.h>y size_tnunca dar un segundo pensamiento a std::size_t; de hecho, nunca se me ocurre que hay (o podría haber) a std::size_t.
std :: size_t es de hecho stddef.h 's size_t .
cstddef da lo siguiente:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... trayendo efectivamente la definición anterior al espacio de nombres estándar.
<cstddef>y esperar obtener ::size_t, pero si lo incluye <stddef.h>, obtendrá std::size_t.
<stddef.h>solo te atrapará ::size_t.
<cstddef>, tiene garantizado obtener std::size_ty también puede obtener ::size_t(pero no está garantizado). Si incluye <stddef.h>está garantizado obtener ::size_ty también puede obtener std::size_t(pero no está garantizado). Era diferente en C ++ 03, pero eso no fue implementable y se solucionó como un defecto.