style sirve que para namespace guide google coding code c++ namespaces naming-conventions header-files size-t

c++ - sirve - Debería incluir stddef.h o cstddef para size_t



google style guide (5)

Ambos están en el estándar y, AFAIK, hay que quedarse.

La forma cXXX siempre introduce los nombres en los espacios de nombres estándar, la forma XXX.h siempre introduce los nombres en el espacio de nombres global. Ambos también pueden poner los nombres en el otro espacio de nombres (al menos en C ++ 0X, no era el caso anteriormente. En lo que respecta a esa restricción, es imposible construir una biblioteca C ++ a partir de una biblioteca C que no controla, el se eliminó la restricción. g ++ sufre de ese problema al menos en los objetivos que no son glibc).

Para los encabezados tradicionales de Unix, en todas las implementaciones que he probado, el formulario XXX.h incluye el identificador de Unix adicional si tiene las macros de funciones necesarias definidas anteriormente. El comportamiento de la forma cXXX fue inconsistente entre las implementaciones. Así que en la práctica utilizo el XXX.h ya que a menudo necesito esas declaraciones.

Cuando quiero usar size_t en C ++, ¿debo incluir <stddef.h> o <cstddef> ? He escuchado a varias personas decir que <cstddef> era una mala idea y que debería ser desaprobada. ¿Porqué es eso?


Prefiero #include <stddef.h> .

Algunos de los nombres en los encabezados de C pueden ser macros, pero el conjunto difiere de las reglas de C. En C, EXIT_FAILURE , isdigit() , getc() ao son macros. ¿Sabes cuáles son las macros en C ++?

En segundo lugar, solo se requieren un par de encabezados C estándar para tener el <cfoo> , <cfoo> encabezados Posix no lo son. ¿Sabe qué encabezados son estándar y cuáles son proporcionados únicamente por su compilador?

En tercer lugar, cuando use encabezados de una biblioteca C de terceros, terminará con #include <stddef.h> , y prefiero no mezclar <stddef.h> y <cstddef> .

En cuarto lugar, el borrador actual para el nuevo estándar de C ++ dice que <cstdlib> puede volcar los símbolos en el espacio de nombres global (porque aparentemente muchos compiladores ya lo hacen hoy en día), por lo que usar #include <cstdlib> no es una garantía de que El espacio de nombres no estará contaminado en el futuro. Por lo tanto, aconsejaría que al escribir un código portátil, debería asumir que el espacio de nombres global se verá afectado (aunque ahora no esté permitido). Como solo unos pocos expertos parecen saber esto (vea la discusión en los comentarios aquí), es mejor usar <stddef.h> ya que incluso un programador principiante de C ++ entenderá que contamina el espacio de nombres global.


<cstddef> es estándar y <stddef.h> no lo es. Eso es casi el final de eso. No va a quedar en desuso en el corto plazo porque hay muchos programas que dependen de él.


<stddef.h> es oficialmente una parte obsoleta de C ++ (junto con el resto del Anexo D del estándar C ++). Todas estas son partes (no desaprobadas) de la Norma C, por lo que a pesar de que están desaprobadas en C ++, es casi seguro que estén disponibles casi indefinidamente.

Muchas de las características que no están en desuso casi seguro desaparecerán primero: la export ya se ha eliminado del borrador actual de C ++ 0x, y si tuviera que adivinar, diría que las especificaciones de excepción eran mucho más propensas a ir que en el Anexo D. Cuando / si estos encabezados se vuelven realmente obsoletos, probablemente será de una versión madura de la propuesta de módulos de David Vandervoorde, que podría hacer que todos los encabezados queden obsoletos.

Al mismo tiempo, un buen número de compiladores (especialmente los más antiguos) no implementan los encabezados <c*> exactamente como prescribe el estándar. Si desea o necesita escribir código que funcione con ellos, puede ganar bastante utilizando los encabezados <*.h> lugar de los encabezados <c*> .

En última instancia, creo que los encabezados <c*> fueron una solución en busca de un problema. El estándar de C requiere que estos encabezados solo definan los nombres que se requieren, no otros en absoluto, excepto los nombres que están reservados, como con un guión bajo seguido de otro guión bajo o mayúscula. Los nombres reservados (y algunos más) también están reservados en C ++, por lo que no pueden chocar con nada en el código portátil en ningún caso. Como tal, todos los encabezados <c*> compran es la capacidad de definir un nombre en el espacio de nombres global que colisiona con un nombre existente en la biblioteca estándar de C. Esa es una idea tan espectacularmente terrible que ni siquiera vale la pena considerarla, por lo que, desde un punto de vista práctico, no has ganado nada.

Edición: Incluso esa capacidad inútil funcionó con pocos compiladores reales suficientes como para que los borradores actuales del C ++ 0x que promueve la combinación combinada otorguen permiso para que los encabezados <c*> contaminen el espacio de nombres global de todos modos, por lo que incluso la ventaja teórica desaparece.


stddef.h es el encabezado de C. El nombre size_t está en el espacio de nombres global en él. <cstddef> , por otro lado, es un encabezado de C ++ que envuelve los nombres de C en el espacio de nombres estándar, que es naturalmente el enfoque de C ++, por lo que si incluye <cstddef> y el compilador es compatible, tendrá que usar std::size_t . Claramente, en C ++, el enfoque de C ++ es más apropiado. HTH

Edición: Técnicamente, el encabezado C también puede contener los nombres en el espacio de nombres estándar. Pero los encabezados en C (aquellos que terminan con .h) introducen los nombres también en el espacio de nombres global (contaminándolo así) a través de declaraciones de uso.