Почему функция 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).

Другие вопросы по тегам