2012-12-04 4 views
5

Обычно один включает в себя стандартные библиотечные заголовки в C++ в глобальном пространстве имен, вне каких-либо extern с, например, так:Каково заданное поведение включения стандартного заголовка C в код C++ внутри спецификации привязки (extern «C», extern «C++»)?

#include <stdint.h> 

int main() { } 

Но что указано произойдет, если включить стандартный заголовок библиотеки внутри одного? Например:

extern "C" { 
#include <stdint.h> 
} 
int main() { } 

или

extern "C++" { 
#include <stdint.h> 
} 
int main() { } 

ли указано, что должно произойти в любом случае, или это определяется реализацией или даже неопределенным?

C++ 11 17.6.2.3p1 говорит, что заголовки стандартной библиотеки C++ помещают вещи в extern "C++", но мое предварительное чтение состоит в том, что это не относится к заголовкам C, например <stdint.h>. C++ 11 17.6.2.2p3 говорит, что заголовки могут быть только #include d за пределами любой «внешней декларации»; эта фраза появляется только в одном месте на C++ 11, поэтому я не уверен, что она может применяться здесь. (Я предполагаю, что C99 не имеет права говорить об этом.)

(Для моего конкретного случая это не возможность использовать стандартные заголовки C++ <c*>, поэтому мне действительно нужно знать семантику только для старой школы C.)

+3

о том, что сломал реализацию, невозможно использовать заголовки C++ ''? И почему следует придерживаться Стандарта по такой нарушенной реализации? – rubenvb

+0

@ rubenvb Разработка во встроенном/ядре часто создавала бы аналогичные ограничения либо технически, либо по выбору – SomeWittyUsername

+0

@icepack Конечно, автономные реализации не обязательно должны включать все части стандартной библиотеки, но если можно указать '* .h' то и соответствующий заголовок 'c *'. Почему любая реализация выбирает не иметь обоих? – bames53

ответ

5

В стандарте ничего не говорится о заголовках C, которые не являются частью C++. Предыдущее значение для C++ - 11, stdint.h/cstdint не было частью C++. Это зависит от того заголовка, как он ведет себя при включении из кода на C++.

Если вы спрашиваете о заголовках C, что являются частью C++, единственного различие между *.h и c* является то, что бывший не требуется, чтобы добавить свои идентификаторы в std имен (это необязательно делает ли это так или нет), в то время как последний требуется, чтобы сделать это (и он также может дополнительно добавить их в глобальное пространство имен.) Нет другой разницы. Вы не должны включать стандартный заголовок *.h внутри блока extern "C", так как сами заголовки позаботятся о необходимости использования C-связи.

Если у вас есть нестандартные заголовки C, которые вы хотите включить из кода C++, то вы должны проверить эти заголовки, чтобы определить, нужно ли их включать extern "C" или нет в каждом конкретном случае.

+0

Заголовки '* .h' необходимы только для добавления имен в глобальное пространство имен, но также могут добавлять их в пространство имен' std'. Заголовки 'c *' должны только добавлять имена в пространство имен 'std', но также могут добавлять их в глобальное пространство имен. – bames53

+0

@ bames53 Спасибо. Исправлена. –

 Смежные вопросы

  • Нет связанных вопросов^_^