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

时间:2011-09-30 10:15:19

标签: 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;
}

我收到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 ++代码

中时,这非常烦人

3 个答案:

答案 0 :(得分:7)

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

my_struct s;         // Error.

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

struct my_struct s;  // Valid.

答案 1 :(得分:3)

void my_struct(void)与您的类/结构具有相同的名称,因为它位于全局名称空间中,它与您的类/结构构造函数冲突。

您可以尝试以下方式:

#include <cstdio>


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

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

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

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

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

return 0;
} 

顺便说一下,struct中的struct my_struct s;在C ++中是多余的。

答案 2 :(得分:0)

  

warning: ‘void my_struct()’ hides constructor for ‘struct my_struct’
  知道这个警告意味着什么吗?

这意味着有时GNU编译器套件发出的警告有点偏。 (尝试在struct my_struct的定义上使用分号后省略分号。如果您使用的是除最近版本的g ++之外的任何内容,则错误消息将有点偏离。)

这里隐藏了一些东西,但它不是struct my_struct的构造函数。隐藏的是名称my_struct作为类型标识符。如果您从变量struct的声明中删除s,则可以看到此操作:使用my_struct s;而不是struct my_struct s;没有{{1}提供的上下文信息现在,编译器必须将struct解释为函数名。