Что означает предупреждение «скрывает конструктор для» при компиляции C ++ с g ++? - PullRequest
5 голосов
/ 30 сентября 2011

Используя следующий код:

#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 ]

7 голосов
/ 30 сентября 2011

Предупреждение указывает на то, что функция my_struct() имеет то же имя, что и структура my_struct.Это означает, что вы не сможете написать:

my_struct s;         // Error.

Поскольку компилятор будет думать, что вы используете функцию как тип.Однако, как вы, вероятно, поняли, вы можете создать свою структуру с помощью ключевого слова struct:

struct my_struct s;  // Valid.
3 голосов
/ 30 сентября 2011

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 ++.

0 голосов
/ 30 сентября 2011

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; Без контекстной информации, предлагаемой ключевым словом struct, компилятор теперь должен интерпретировать my_struct как имя функции.

...