Поведение <fcntl.h>
и <unistd.h>
в C ++ не определено стандартом (поскольку они также не являются частью стандарта C89). Тем не менее, я никогда не видел платформу, где они (а) существуют и (б) действительно должны быть заключены в блок extern "C"
.
Поведение <stdio.h>
, <math.h>
и других стандартных заголовков C определено в разделе D.5 стандарта C ++ 03. Им не требуется блок-оболочка extern "C"
, и они сбрасывают свои символы в глобальное пространство имен. Тем не менее, все в Приложении D "устарело".
Каноническая форма C ++ этих заголовков - <cstdio>
, <cmath>
и т. Д., И они определены в разделе 17.4.1.2 (3) стандарта C ++, в котором говорится:
<cassert> <ciso646> <csetjmp> <cstdio> <ctime> <cctype> <climits>
<csignal> <cstdlib> <cwchar> <cerrno> <clocale> <cstdarg> <cstring>
<cwctype>
За исключением случаев, указанных в пунктах 18-27, содержимое каждого заголовка
Имя cname должно совпадать с именем соответствующего заголовка name.h, так как
указано в ИСО / МЭК 9899: 1990 Языки программирования C (раздел 7), или
ISO / IEC: 1990 Языки программирования - C ПОПРАВКА 1: C Целостность, (пункт
7) при необходимости, как будто путем включения. В стандартной библиотеке C ++
однако, объявления и определения (за исключением имен, которые
определенные как макросы в C) находятся в области имен (3.3.5)
Пространство имен.
Таким образом, стандартный, не осуждаемый, канонический способ использования (например) printf
в C ++ - это #include <cstdio>
, а затем вызывать std::printf
.