Может ли стандартный заголовок стандартной библиотеки С++ включать стандартный заголовок C?
Я могу найти только в стандартном черновике N4582, который
[res.on.headers/1] Заголовок С++ может содержать другие заголовки С++.
Кажется, не следует указывать, может ли заголовок С++ включать стандартный заголовок C.
Если это разрешено, небезопасно использовать глобальное имя, определенное в стандартном заголовке C, даже если этот заголовок не включен (так как программа может неявно включать заголовок через некоторый стандартный заголовок С++)?
Ответы
Ответ 1
Для целей вопроса, которым вы следуете (конфликты имен), да, это, безусловно, может. Причина в том, что стандартная библиотека С++ включает заголовки <c:::>
С++ для содержимого стандартной библиотеки C, и стандарт явно позволяет им также предоставлять имена в глобальном пространстве имен (в дополнение к обязательным предоставлением их в ::std
).
Далее, на основе Приложения D [des] стандарта С++, стандартные заголовки библиотеки C (версии <:::.h>
) также являются частью стандартной библиотеки С++ (хотя и устарели). Это означает, что [res.on.headers]/1 позволяет включать заголовки С++.
Ответ 2
Раздел D.3 C стандартные заголовки библиотек стандарта С++ составляют 26 C стандартных заголовков на С++. Таким образом, они являются частью С++. Также многие другие заголовки C придерживаются общего подмножества языков (возможно, с помощью #ifdef
с некоторыми вещами), что делает их оба действительными заголовками C и С++.