Подтвердить что ты не робот

Может ли стандартный заголовок стандартной библиотеки С++ включать стандартный заголовок C?

Я могу найти только в стандартном черновике N4582, который

[res.on.headers/1] Заголовок С++ может содержать другие заголовки С++.

Кажется, не следует указывать, может ли заголовок С++ включать стандартный заголовок C.

Если это разрешено, небезопасно использовать глобальное имя, определенное в стандартном заголовке C, даже если этот заголовок не включен (так как программа может неявно включать заголовок через некоторый стандартный заголовок С++)?

4b9b3361

Ответ 1

Для целей вопроса, которым вы следуете (конфликты имен), да, это, безусловно, может. Причина в том, что стандартная библиотека С++ включает заголовки <c:::> С++ для содержимого стандартной библиотеки C, и стандарт явно позволяет им также предоставлять имена в глобальном пространстве имен (в дополнение к обязательным предоставлением их в ::std).

Далее, на основе Приложения D [des] стандарта С++, стандартные заголовки библиотеки C (версии <:::.h>) также являются частью стандартной библиотеки С++ (хотя и устарели). Это означает, что [res.on.headers]/1 позволяет включать заголовки С++.

Ответ 2

Раздел D.3 C стандартные заголовки библиотек стандарта С++ составляют 26 C стандартных заголовков на С++. Таким образом, они являются частью С++. Также многие другие заголовки C придерживаются общего подмножества языков (возможно, с помощью #ifdef с некоторыми вещами), что делает их оба действительными заголовками C и С++.