Почему функция stat() не скрывает конструктор struct stat в C++?
Если я скомпилирую следующий код, используя "g++ -Wshadow -c":
struct foo
{
int x;
};
void foo(char* x, struct foo* y);
Я получаю ожидаемое:
предупреждение: "void foo(char*, foo*)" скрывает конструктор для "struct foo" [-Wshadow]
void foo (char * x, struct foo * y);
Почему я не получаю одно и то же предупреждение всякий раз, когда я включаю заголовочный файл "sys / stat.h", который определяет как "struct stat", так и функцию stat()? Gcc знает о stat и обрабатывает его специально, или в заголовках есть что-то, что подавляет предупреждение?
1 ответ
Решение
Предупреждение безоговорочно подавляется в системных заголовках (не только без -Wsystem-headers
):
if (to_type != old_type
&& warn_shadow
&& MAYBE_CLASS_TYPE_P (TREE_TYPE (to_type))
&& !(DECL_IN_SYSTEM_HEADER (decl)
&& DECL_IN_SYSTEM_HEADER (to_type)))
warning (OPT_Wshadow, "%q#D hides constructor for %q#D",
decl, to_type);
Вы можете воспроизвести это для вашего примера, если поместите его в заголовочный файл в каталоге, указанном с помощью -isystem
(вместо -I
).