Этот код стандарт соответствует?Может ли типы `cname` и` name.h` быть разными?
#include <stdio.h>
#include <cstdio>
int main() {
FILE *f1 = 0;
std::FILE *f2 = f1;
}
Объяснение: Стандарт говорит [заголовки]:
[...] содержание каждого заголовка
cname
должны быть такими же, как и у соответствующего заголовкаname.h
[... ] как бы включением. Однако в стандартной библиотеке C++ объявления [...] находятся в области пространства имен (3.3.6) пространства именstd
. Неизвестно, объявлены ли эти имена впервые в области глобального пространства имен и затем они вводятся в пространство именstd
с помощью явных с использованием объявлений (7.3.3).
Таким образом, в случае, если они не вводят явным использованием декларирование, они могут быть разные типа? Я не думаю, что фраза «как бы по включению» является окончательной, поскольку другая половина текста явно противоречит этому требованию, требуя, чтобы имена находились в пространстве имен std
.
Добро пожаловать в StackOverflow. Я рекомендую сделать ваш ответ максимально приближенным, поэтому, когда есть два вопроса (как здесь: (1) Соответствует ли этот код стандарту и (2) Может ли std :: FILE и :: FILE быть разными типами) простое «Да» могло бы ввести в заблуждение. Пожалуйста, дважды проверьте, что я не исказил то, что вы намеревались сказать. –
+1, потому что именно так я понимаю абзац. Однако, как правило, вы не можете реализовать его таким образом, потому что он сломается, если 'stdio.h' включает в себя охранники или эквивалент. – ybungalobill