Каково поведение при включении стандартного заголовка C в коде C ++ внутри спецификации связей (extern «C», extern «C ++»)?

Обычно один включает стандартные заголовки библиотеки в 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 говорит, что заголовки могут быть только #included вне любой «внешней декларации»; эта фраза встречается только в одном месте в C ++ 11, поэтому я не уверен, может ли она здесь применяться. (Я предполагаю, что C99 ничего не может сказать по этому поводу.)

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

5

Решение

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

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

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]