Обычно один включает стандартные заголовки библиотеки в C ++ в глобальном пространстве имен, вне extern
с, вот так:
#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, которые не являются частью C ++. Предыдущий C ++ — 11, stdint.h
/cstdint
не был частью C ++. Это зависит от того, как этот заголовок ведет себя при включении из кода C ++.
Если вы спрашиваете о заголовках C, что являются часть C ++, единственная разница между *.h
а также c*
является то, что первый не обязан добавлять свои идентификаторы в std
пространство имен (это необязательно, делает ли это так или нет), в то время как последний требуется сделать это (и он также может добавить их в глобальное пространство имен.) Других различий нет. Вы не должны включать стандарт *.h
заголовок внутри extern "C"
блок, так как заголовки сами позаботятся об использовании связи C, где это необходимо.
Если у вас есть нестандартные заголовки C, которые вы хотите включить из кода C ++, вы должны проверить эти заголовки, чтобы определить, нужно ли их включать extern "C"
или не в каждом конкретном случае.
Других решений пока нет …