开发者

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

Using the following code:

#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;
}

I get a warning compiling with g++ -Wshadow main.cpp:

main.cpp:15:20: warning: ‘void my_struct()’ hides constructor for ‘struct my_struct’

I would be ok with that warning if the void my_stru开发者_如何学Pythonct function actually replaced the my_struct::my_struct one. But it does not appears to be the case. If I run the program, I get:

constructor
1-2

Any idea what this warning mean ? It is quite annoying especially when I include C headers into C++ code


The warning points out that the my_struct() function has the same name as the my_struct structure. It means you will be unable to write:

my_struct s;         // Error.

Because the compiler will think that you're using a function as a type. However, as you probably realized, you can still instantiate your structure with the struct keyword:

struct my_struct s;  // Valid.


void my_struct(void) has the same name of your class/struct and since it is in the global namespace it is conflicting with your class/struct's constructor.

You could try something like:

#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;
} 

And by the way the struct in struct my_struct s; is redundant in C++.


warning: ‘void my_struct()’ hides constructor for ‘struct my_struct’
Any idea what this warning mean ?

It means that sometimes the warnings issued by the GNU compiler suite are a bit off. (Try omitting the semicolon after the close brace on the definition of struct my_struct. If you are using anything but a very recent version of g++ the error message will be a bit off.)

Something is being hidden here, but it is not the constructor for struct my_struct. What is being hidden is the name my_struct as a type identifier. You can see this in action if you remove the struct from the declaration of the variable s: Use my_struct s; instead of struct my_struct s; Without the contextual information offered by the struct keyword, the compiler now must interpret my_struct as a function name.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜