Обычно один включает в себя стандартные библиотечные заголовки в 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.)
о том, что сломал реализацию, невозможно использовать заголовки C++ ''? И почему следует придерживаться Стандарта по такой нарушенной реализации? –
rubenvb
@ rubenvb Разработка во встроенном/ядре часто создавала бы аналогичные ограничения либо технически, либо по выбору – SomeWittyUsername
@icepack Конечно, автономные реализации не обязательно должны включать все части стандартной библиотеки, но если можно указать '* .h' то и соответствующий заголовок 'c *'. Почему любая реализация выбирает не иметь обоих? – bames53