Extrait de la norme C++11 (c'est moi qui souligne) :
D.5 En-têtes de la bibliothèque standard C [depr.c.headers]
- Pour la compatibilité avec la bibliothèque standard C ...
- Chaque en-tête C, dont le nom est de la forme nom.h se comporte comme si chaque nom placé dans t par l'espace de noms de la bibliothèque standard nom est placé dans l'en-tête espace de noms global champ d'application. Il est non spécifié si ces noms sont d'abord déclarés ou définis à l'intérieur de l'espace de noms (3.3.6) de l'espace nominatif std et sont ensuite injectés dans l'espace de noms global par des déclarations d'utilisation explicites (7.3.3).
-
Ejemplo: L'en-tête
<cstdlib>
assurément fournit ses déclarations et définitions à l'intérieur des dénominationspa std
. Il peut également fournir ces noms dans l'espace de noms global. L'en-tête <stdlib.h>
assurément fournit les mêmes déclarations et définitions dans l'espace de noms global comme dans la norme C. Il peut également fournir ces noms dans l'espace de noms std
.
L'utilisation des en-têtes "name.h" est dépréciée, ils ont été identifiés comme candidats à la suppression dans les révisions futures.
Je suggère donc d'inclure les en-têtes "cname" et d'utiliser les déclarations et définitions de la base de données std
l'espace de noms.
Si vous devez utiliser les en-têtes "name.h" pour certaines raisons (il est déprécié, voir ci-dessus), je suggérerais d'utiliser les déclarations et les définitions de l'espace de noms global.
En d'autres termes : préférer
#include <cstdio>
int main() {
std::printf("Hello world\n");
}
plus
#include <stdio.h>
int main() {
printf("Hello world\n");
}
0 votes
Je doute qu'il y ait une différence. Il semble que printf() soit simplement inclus dans la fonction std mais d'après la description faite par cppreference, il nécessite toujours l'utilisation de
cstdio
. Il suffit de tenir compte des espaces de noms (ou de leur absence).18 votes
Si un jour ils rendent obligatoire la mise en décharge des
C
dans l'espace de noms global est illégale, je préfère utiliser la méthode de l'espace de noms global.std::
qualifie les versions. (D'ailleurs, j'aurais préféré qu'ils les rendent illégales).3 votes
@Galik : D'accord. Ce serait
7 votes
T no .
2 votes
"
9 votes
@sasauke non, ce n'est pas un sous-ensemble. C et C++ définitivement action un sous-ensemble, mais C lui-même n'est pas un sous-ensemble de C++.
0 votes
" il apparaît également comme
std::printf("Hello world!);
" Vous avez fait une faute de frappe ? Cela ressemble au deuxième exemple d'utilisation dans la phrase précédente.0 votes
AFAIK, c'est la même chose parce que tous les exemples que vous avez fournis produiront une erreur d'analyse. Vous vouliez probablement dire
"Hello world!"
au lieu de"Hello world!
(sans double guillemet final).0 votes
@Olaf Il serait plus correct de dire que C est presque un sous-ensemble de C++. (Par opposition à : en quelque sorte un sous-ensemble de C++)
2 votes
@immibis : Non, j'ai utilisé ce terme à dessein. Certaines constructions avec une syntaxe identique ont une sémantique différente en C et C++ et d'autres sont fortement recommandées/exigées en C, alors qu'elles ne sont pas possibles en C++, comme le casting.
void *
à d'autres pointeurs (voir la norme C). Le terme "presque" laisserait entendre que seuls quelques changements mineurs sont nécessaires, ce qui n'est pas le cas.