Hành vi của <fcntl.h>
và <unistd.h>
trong C++ không được chỉ định theo tiêu chuẩn (vì chúng cũng không phải là một phần của tiêu chuẩn C89). Điều đó nói rằng, tôi chưa bao giờ nhìn thấy một nền tảng mà họ (a) tồn tại và (b) thực sự cần phải được bọc trong một khối extern "C"
.
Hành vi của <stdio.h>
, <math.h>
và các tiêu đề C chuẩn khác được chỉ định theo phần D.5 của tiêu chuẩn C++ 03. Họ không yêu cầu một khối bao bọc extern "C"
và họ đưa biểu tượng của họ vào không gian tên chung. Tuy nhiên, mọi thứ trong Phụ lục D đều "không được chấp nhận".
C++ hình thức kinh điển của những tiêu đề là <cstdio>
, <cmath>
, vv, và họ được quy định bởi phần 17.4.1.2 (3) của chuẩn C++, mà nói:
<cassert> <ciso646> <csetjmp> <cstdio> <ctime> <cctype> <climits>
<csignal> <cstdlib> <cwchar> <cerrno> <clocale> <cstdarg> <cstring>
<cwctype>
Trừ khi ghi chú trong các điều từ 18 đến 27, nội dung của mỗi tiêu đề cname phải giống với tên của tiêu đề tương ứng.h, như được quy định trong ISO/IEC 9899: Ngôn ngữ lập trình 1990 C (khoản 7) hoặc ISO/Ngôn ngữ lập trình IEC: 1990-C SỬA ĐỔI 1: Tính toàn vẹn C, (Khoản 7), như ap sở hữu, như thể bao gồm. Tuy nhiên, trong Thư viện chuẩn C++, , các khai báo và định nghĩa (ngoại trừ các tên là được định nghĩa là macro trong C) nằm trong phạm vi không gian tên (3.3.5) của không gian tên .
Vì vậy, tiêu chuẩn, không bị phản đối, cách kinh điển để sử dụng (ví dụ) printf
trong C++ là #include <cstdio>
và sau đó gọi std::printf
.
Chỉ tìm thấy câu hỏi này tương tự như câu hỏi của bạn: [Tại sao chúng ta cần bên ngoài "C" {#include} trong C++?] (Http://stackoverflow.com/questions/67894/why-do-we-need -extern-c-include-foo-h-in-c) –
AusCBloke