为什么函数 stat() 不隐藏 C++ 中的 struct stat 构造函数?

Why doesn't the function stat() shadow the struct stat constructor in C++?

如果我使用"g++ -Wshadow -c"编译以下代码:

struct foo
{
   int x;
};
void foo(char* x, struct foo* y);

我得到了预期的结果:

warning: ‘void foo(char*, foo*)’ hides constructor for ‘struct foo’ [-Wshadow]
void foo(char* x, struct foo* y);

为什么我在包含 header 文件 "sys/stat.h" 时没有收到相同的警告,该文件定义了 "struct stat" 和函数 stat()? gcc 是否了解 stat 并对其进行特殊处理,或者 headers 中是否存在抑制警告的内容?

警告在系统 headers 中被无条件抑制(不仅仅是没有 -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)指定目录中的 header 文件中,则可以为您的示例重现此内容。