c++ - que - size_t arduino
es size_t siempre sin firmar? (6)
Como título: es size_t siempre sin signo, es decir, para size_t x
, es x
siempre >= 0
?
De acuerdo con el estándar no está firmado, sin embargo, recuerdo que algunas implementaciones anteriores usaban un tipo firmado para typedef.
De un antiguo documento de GCC:
Existe un problema potencial con el tipo size_t y las versiones de GCC antes de la versión 2.4. ANSI C requiere que
size_t
siempre sea un tipo sin signo. Para la compatibilidad con los archivos de encabezado de los sistemas existentes, GCC definesize_t
enstddef.h
como el tipo quesys/types.h
define. La mayoría de los sistemas Unix que definensize_t
ensys/types.h
, lo definen como un tipo firmado. Algunos códigos en la biblioteca dependen de quesize_t
sea un tipo sin firma, y no funcionará correctamente si está firmado
No estoy seguro de lo importante que sería protegerse contra eso. Mi código asume que está sin firmar.
El tamaño_t debe seguir la misma definición que el estándar C, y en varios lugares del estándar C ++ implica que está sin signo natura (particularmente en las definiciones de argumento de la plantilla del asignador).
En la Norma C ++, sección 18.1 (ISO / IEC 14882 - Primera edición 1998-01-01):
La tabla 15 enumera como tipos definidos: ptrdiff_t y size_t
3 El contenido es el mismo que el encabezado de la biblioteca de Standard C, con los siguientes cambios: 4 La macro NULL es una constante de puntero nulo de C ++ definida por la implementación en esta Norma Internacional (4.10).
La macro offsetof acepta un conjunto restringido de argumentos de tipo en esta Norma Internacional. el tipo será una estructura POD o una unión POD (cláusula 9). El resultado de aplicar la macro offsetof a un campo que es un miembro de datos estáticos o un miembro de función no está definido. VEA TAMBIÉN: la subcláusula 5.3.3, Sizeof, la subcláusula 5.7, los operadores aditivos, la subcláusula 12.5, la tienda gratuita y la subcláusula ISO C 7.1.6.
Oh, esto es simplemente terrible:
vector<MyObject> arr;
Fill(arr);
size_t size = arr.size();
for(size_t i = 1; i < size - 1; ++i)
{
auto obj = arr[i];
auto next = arr[i+1];
}
Ahora contemplar el caso de uso donde arr está vacío.
Sí, se garantiza que size_t es un tipo sin firma.
Según la norma ISO C de 1999 (C99), size_t
es un tipo entero sin signo de al menos 16 bits (consulte las secciones 7.17 y 7.18.3).
La norma también recomienda que size_t
no debería tener un rango de conversión entero mayor que long
si es posible, es decir, convertir size_t
a unsigned long
no es problemático si se sigue la recomendación.
El estándar ANSI C de 1989 (ANSI C) no menciona un tamaño mínimo ni un rango de conversión recomendado.
El estándar ISO C ++ de 1998 (C ++ 98) (así como el borrador actual para C ++ 0x) se refiere al estándar C. La sección 18.1 dice:
El contenido es el mismo que el encabezado de la biblioteca C estándar
<stddef.h>
[...]
Según la sección 1.2, esto significa la biblioteca tal como se define en la norma ISO C de 1990 (C90), incluida su primera enmienda de 1995 (C95):
La biblioteca descrita en la cláusula 7 de ISO / IEC 9899: 1990 y la cláusula 7 de ISO / IEC 9899 / Amd.1: 1995 se denomina en lo sucesivo la biblioteca C estándar .
Las partes relacionadas con size_t
deben heredarse de ANSI C: Aparte de la numeración de la parte frontal y de la sección, los estándares para C90 y ANSI C son idénticos. Necesitaría una copia de la enmienda normativa para estar seguro de que no hubo cambios relevantes en stddef.h
, pero lo dudo. El tamaño mínimo parece introducirse con stdint.h
, es decir, C99.
Por favor, considere también la siguiente cita de la sección 1.2 de C ++ 98:
Todas las normas están sujetas a revisión, y se recomienda a las partes de los acuerdos basados en esta Norma Internacional que investiguen la posibilidad de aplicar las ediciones más recientes de las normas que se indican a continuación.
Si Generalmente se define como algo como lo siguiente (en sistemas de 32 bits):
typedef unsigned int size_t;
Referencia:
El estándar C ++ La Sección 18.1 define que size_t
está en <cstddef>
que se describe en C Standard como <stddef.h>
.
La sección 4.1.5 del estándar C define size_t
como un tipo integral sin signo del resultado del operador sizeof