g ++ предупреждение при использовании необязательного ключевого слова struct - PullRequest
10 голосов
/ 02 июня 2011

Если я напишу эту программу:

#include <iostream>

namespace foo {
    struct bar {
        int x;
    };
}

int main (void) {
    struct foo::bar *a = new struct foo::bar;
    delete a;
    return 0;
}

и скомпилирую ее с:

g++ main.cxx -Wall -Wextra

Это выдает мне следующее предупреждение:

main.cxx: In function ‘int main()’:
main.cxx:10:39: warning: declaration ‘struct foo::bar’ does not declare anything [enabled by default]

Однако, еслиЯ вынимаю ключевое слово struct после ключевого слова new:

#include <iostream>

namespace foo {
    struct bar {
        int x;
    };
}

int main (void) {
    struct foo::bar *a = new foo::bar;
    delete a;
    return 0;
}

и компилирую его так же, g ++ не выводит предупреждений.Почему g ++ выводит это предупреждение, если я использую ключевое слово struct?

Ответы [ 4 ]

5 голосов
/ 02 июня 2011

В C ++ ключевое слово struct определяет тип, а новому типу больше не нужно ключевое слово struct.Это одно из многих различий между C и C ++.

3 голосов
/ 02 июня 2011

Проверка ошибки:

main.cxx: 10: 39: предупреждение: объявление ‘struct foo::bar’ ничего не объявляет [включено по умолчанию]

g ++ считаетвы объявляете новый struct с именем foo::bar вместо выделения памяти типа struct foo::bar.Я предполагаю, что g ++ предполагает, что любое использование struct, которое не объявляет lvalue, предназначено для объявления типа.

2 голосов
/ 02 июня 2011

Просто опубликуйте минимальный код, который иллюстрирует и не иллюстрирует проблему:

namespace N {
struct A {};
}

struct B {};

int main() {
    struct N::A * a  = new struct N::A; // problem
    struct B * b  = new struct B;       // ok
}

Лично я думаю, что это небольшая ошибка GCC, но я не мудр в бесчисленных способах пространств имен.

1 голос
/ 02 июня 2011

Примечание:

   struct foo::bar *a = new struct foo::bar;
// ^^^^^^ (1)
                        //  ^^^^^^ (2)
  1. Не требуется в C ++
    • Помещение структуры здесь - это похмелье от C и больше не требуется в C ++
      Поскольку все типывсе в том же namespace.
      В то время как в структурах C было собственное пространство имен, отдельное от других типов.
      Разрешено сохранять обратную совместимость с C.
  2. structздесь выглядит, как будто это что-то вперед.

В C ++ выше написано:

   foo::bar* a = new foo::bar;

// или предпочтительно

   foo::bar* a = new foo::bar(); // This makes a difference if you don't define
                                 // a default constructor.

От Дэвида(Ниже)

Достаточно важно, я думаю, что это должно быть в ответе, а не в комментариях:

namespace foo
{
    struct bar {};
    void bar() {}
}

int main()
{
    struct foo::bar* p = new struct foo::bar;
    // Needed here because the compiler can't tell the difference between
    // a struct and a function otherwise
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...