使用 g++ 编译C++时,"隐藏构造函数"警告是什么意思?

What does the 'hides constructor for' warning mean when compiling C++ with g++?

本文关键字:警告 构造函数 是什么 意思 隐藏 使用 编译 C++ g++      更新时间:2023-10-16

使用以下代码:

#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解释为函数名。