为什么函数 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 文件中,则可以为您的示例重现此内容。
如果我使用"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 文件中,则可以为您的示例重现此内容。