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

mbo*_*nin 5 c++ g++

使用以下代码:

#include <stdio.h>


struct my_struct {
        int a;
        int b;
        my_struct();
};

my_struct::my_struct(void)
{
        printf("constructor\n");
}

void my_struct(void)
{
        printf("standard function\n");
}

int main (int argc, char *argv[])
{
        struct my_struct s;
        s.a = 1;
        s.b = 2;

        printf("%d-%d\n", s.a, s.b);

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到一个用g ++ -Wshadow main.cpp编译的警告:

main.cpp:15:20: warning: ‘void my_struct()’ hides constructor for ‘struct my_struct’
Run Code Online (Sandbox Code Playgroud)

如果void my_struct函数实际上替换了my_struct :: my_struct,那么我可以使用该警告.但似乎并非如此.如果我运行该程序,我得到:

constructor
1-2
Run Code Online (Sandbox Code Playgroud)

知道这个警告意味着什么吗?特别是当我将C头包含在C++代码中时,这非常烦人

Fré*_*idi 7

该警告指出该my_struct()函数与my_struct结构具有相同的名称.这意味着你将无法写:

my_struct s;         // Error.
Run Code Online (Sandbox Code Playgroud)

因为编译器会认为您正在使用函数作为类型.但是,正如您可能已经意识到的那样,您仍然可以使用struct关键字实例化您的结构:

struct my_struct s;  // Valid.
Run Code Online (Sandbox Code Playgroud)

  • 再举一个例子,`my_struct();`现在是对函数的调用,而没有阴影它会构造一个临时的. (2认同)