使用 g++ 编译C++时,"隐藏构造函数"警告是什么意思?
What does the 'hides constructor for' warning mean when compiling C++ with g++?
使用以下代码:
#include <stdio.h>
struct my_struct {
int a;
int b;
my_struct();
};
my_struct::my_struct(void)
{
printf("constructorn");
}
void my_struct(void)
{
printf("standard functionn");
}
int main (int argc, char *argv[])
{
struct my_struct s;
s.a = 1;
s.b = 2;
printf("%d-%dn", s.a, s.b);
return 0;
}
我得到一个警告编译g++ -Wshadow main.cpp:
main.cpp:15:20: warning: ‘void my_struct()’ hides constructor for ‘struct my_struct’
如果void my_struct函数实际上取代了my_struct::my_struct函数,我就可以接受这个警告。但事实似乎并非如此。如果我运行程序,我得到:
constructor
1-2
你知道这个警告是什么意思吗?这很烦人,特别是当我在c++代码中包含C头文件
警告指出my_struct()
函数与my_struct
结构具有相同的名称。这意味着您将无法写入:
my_struct s; // Error.
因为编译器会认为你使用了一个函数作为类型。然而,正如您可能意识到的,您仍然可以使用struct
关键字实例化您的结构:
struct my_struct s; // Valid.
void my_struct(void)
具有与您的类/结构相同的名称,并且由于它在全局命名空间中,因此与您的类/结构的构造函数相冲突。
你可以试试这样写:
#include <cstdio>
struct my_struct {
int a;
int b;
my_struct();
};
my_struct::my_struct(void)
{
printf("constructorn");
}
namespace mbonnin
{
void my_struct(void);
}
void mbonnin::my_struct(void)
{
printf("standard functionn");
}
int main (int argc, char *argv[])
{
my_struct s;
s.a = 1;
s.b = 2;
printf("%d-%dn", s.a, s.b);
mbonnin::my_struct();
return 0;
}
顺便说一下,struct my_struct s;
中的struct
在c++中是冗余的
warning: ‘void my_struct()’ hides constructor for ‘struct my_struct’
知道这个警告是什么意思吗?
这意味着有时GNU编译器套件发出的警告有点偏离。(尝试在struct my_struct
的定义上省略右括号后的分号。如果您使用的不是最新版本的g++,则错误消息将有点偏离。)
这里隐藏了一些东西,但它不是struct my_struct
的构造函数。隐藏的是名称my_struct
作为类型标识符。如果您从变量s
的声明中删除struct
,您就可以看到这一点:使用my_struct s;
而不是struct my_struct s;
如果没有struct
关键字提供的上下文信息,编译器现在必须将my_struct
解释为函数名。
- 构造函数中的 C4267 转换警告 - 无法修复过载?
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 当我尝试从成员函数调用构造函数时,为什么IDE会发出警告
- 带有C 11继承的构造函数的警告
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 警告C26495函数调用从构造函数到初始化变量,原因
- 为什么 GCC 在使用继承的构造函数时警告我无用的强制转换
- 在使用复制构造函数和赋值时生成警告
- 为什么 g++ 不发出这个与构造函数相关的 noexcept 启用"-fpic"的警告?
- 警告:基类应在复制构造函数中显式初始化
- 实现 C++11 委派构造函数功能会导致多个警告
- C++ 显式声明会在默认构造函数中触发警告
- 扩展具有私有构造函数和析构函数的单例类会给出编译时警告
- GCC:缺少关于构造函数中初始化顺序的警告
- 警告:基类“A”应在复制构造函数中显式初始化
- 关于在构造函数中将临时绑定到引用成员的虚假警告
- 使用 g++ 编译C++时,"隐藏构造函数"警告是什么意思?
- 类和构造函数C++ - 错误和警告 C2146, C4430
- 针对多个复制构造函数的编译器警告
- clang中如何处理全局构造函数警告