Del estándar C ++ 11 (el énfasis es mío):
D.5 Encabezados de biblioteca estándar de C [encabezados depr.c.]
- Para compatibilidad con la biblioteca estándar C ...
- Cada encabezado C, cada uno de los cuales tiene un nombre del formulario name.h , se comporta como si cada nombre colocado en el espacio de nombres de la biblioteca estándar por el encabezado cname correspondiente estuviera ubicado dentro del ámbito del espacio de nombres global . No se especifica si estos nombres se declaran o definen primero dentro del alcance del espacio de nombres (3.3.6) del espacio de nombres std y luego se inyectan en el alcance del espacio de nombres global mediante declaraciones de uso explícitas (7.3.3).
- Ejemplo: el encabezado
<cstdlib> seguramente proporciona sus declaraciones y definiciones dentro del espacio de nombres
std . También puede proporcionar estos nombres dentro del espacio de nombres global. El encabezado <stdlib.h> seguramente proporciona las mismas declaraciones y definiciones dentro del espacio de nombres global , como en el estándar C. También puede proporcionar estos nombres dentro del espacio de nombres std.
El uso de los encabezados «name.h» está en desuso, se han identificado como candidatos para ser eliminados de futuras revisiones.
Entonces, sugeriría incluir los encabezados «cname» y usar las declaraciones y definiciones del stdespacio de nombres.
Si tiene que usar los encabezados «name.h» por alguna razón (está desaprobado, vea arriba), sugeriría usar las declaraciones y definiciones del espacio de nombres global.
En otras palabras: prefiero
#include <cstdio>
int main() {
std::printf("Hello world\n");
}
encima
#include <stdio.h>
int main() {
printf("Hello world\n");
}
Csímbolos de la biblioteca en el espacio de nombres global sea ilegal, prefiero usar lasstd::versiones calificadas. (Además, desearía que lo hubieran hecho ilegal).