Структуры & g++

Модератор: Модераторы разделов

Аватара пользователя
Aectann
Бывший модератор
Сообщения: 3491
Статус: ...
ОС: OS X, GNU_и_не_только/Linux

Структуры & g++

Сообщение Aectann »

Вопрос, наверное, идиотский: создаю любую структуру:
struct name
{
int data;
int data2;
};

В функции main() или в каком-нибудь классе объявляю указатель на структуру:

name* n;

При компиляции вылетает ошибка:

error: ISO C++ forbids declaration of 'name' with no type

При объявлении простой структурной переменной типа

name n;
вылетает другая ошибка:

error: 'name' does not name a type

причём если создать указатель на структуру в самой структуре:

struct name
{
name* n;
};

то всё в порядке.
Версия g++ - 4.0.3. То же самое делал на g++-3.4.4 и в MS Visual Studio и таких ошибок не было.
В чём здесь дело?

P.S. Не бейте сильно, С++ я начал изучать недавно :)
My god... it's full of stars!...
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Структуры & g++

Сообщение nercus »

typedef struct {...} name;
name *p;
или
struct name {...};
struct name *p;
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Структуры & g++

Сообщение t.t »

(nercus @ Jan 31 2006, в 21:47) писал(а):typedef struct {...} name;
name *p;
или
struct name {...};
struct name *p;
или
struct {...} *p;
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Aectann
Бывший модератор
Сообщения: 3491
Статус: ...
ОС: OS X, GNU_и_не_только/Linux

Re: Структуры & g++

Сообщение Aectann »

Большое спасибо!
My god... it's full of stars!...
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Структуры & g++

Сообщение v04bvs »

Неправда, в С++ всё должно работать так как вы говорите. Вот, демонстрирую

Код: Выделить всё

v04bvs@debian:~/test$ cat test.cc
struct name
{
    int a;
    int b;
};

int main( )
{
    name z;
    name *s;
}
v04bvs@debian:~/test$ g++ test.cc
v04bvs@debian:~/test$ g++ --version
g++ (GCC) 4.0.3 20051201 (prerelease) (Debian 4.0.2-5)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Больше похоже на то, что он вообще не видит объявление структуры.
А вышеперечисленные советы относятся в C, где такой синтаксис действительно является ошибкой.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Структуры & g++

Сообщение serzh-z »

Весь код в студию, плз.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Структуры & g++

Сообщение t.t »

(v04bvs @ Feb 1 2006, в 13:04) писал(а):Больше похоже на то, что он вообще не видит объявление структуры.
А вышеперечисленные советы относятся в C, где такой синтаксис действительно является ошибкой.
Спасибо за поправку -- в плюсах никогда не практиковал, забыл.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Aectann
Бывший модератор
Сообщения: 3491
Статус: ...
ОС: OS X, GNU_и_не_только/Linux

Re: Структуры & g++

Сообщение Aectann »

v04bvs писал(а):
01.02.2006 13:04
Неправда, в С++ всё должно работать так как вы говорите. Вот, демонстрирую

Код: Выделить всё

v04bvs@debian:~/test$ cat test.cc
struct name
{
    int a;
    int b;
};

int main( )
{
    name z;
    name *s;
}
v04bvs@debian:~/test$ g++ test.cc
v04bvs@debian:~/test$ g++ --version
g++ (GCC) 4.0.3 20051201 (prerelease) (Debian 4.0.2-5)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Больше похоже на то, что он вообще не видит объявление структуры.
А вышеперечисленные советы относятся в C, где такой синтаксис действительно является ошибкой.

Ага, так и должно работать(в стиле С++), но не работает. Может дело в 4 версии gcc?
My god... it's full of stars!...
Спасибо сказали:
Аватара пользователя
Aectann
Бывший модератор
Сообщения: 3491
Статус: ...
ОС: OS X, GNU_и_не_только/Linux

Re: Структуры & g++

Сообщение Aectann »

Нет, дело видимо не в версии, а в чём-то другом.(вот только в чём?) Только что проверил на g++-3.4 - то же самое.
My god... it's full of stars!...
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Структуры & g++

Сообщение serzh-z »

Aectann писал(а):
04.02.2006 15:41
Нет, дело видимо не в версии, а в чём-то другом.(вот только в чём?) Только что проверил на g++-3.4 - то же самое.


Вроде бы выше был кусок кода, который v04bvs собрал на gcc 4.x без проблем...

Можно предположить, что вероятнее всего имеет место быть банальная ошибка "забыл точку с запятой или фигурную скобку", потому компилятор и не видит тип name'. Но чём можно можно рассуждать, если не ясно в каком контексте возникает ошибка?
Спасибо сказали:
Аватара пользователя
Aectann
Бывший модератор
Сообщения: 3491
Статус: ...
ОС: OS X, GNU_и_не_только/Linux

Re: Структуры & g++

Сообщение Aectann »

serzh-z писал(а):
04.02.2006 22:38
Вроде бы выше был кусок кода, который v04bvs собрал на gcc 4.x без проблем...

Можно предположить, что вероятнее всего имеет место быть банальная ошибка "забыл точку с запятой или фигурную скобку", потому компилятор и не видит тип name'. Но чём можно можно рассуждать, если не ясно в каком контексте возникает ошибка?

Да нет, таких ошибок не было. Тем более что если поставить struct в объявлении переменной(то есть как в C, а не в C++), всё работает нормально. Видимо ругается на синтаксис. Хотя код, приведённый v04bvs компилируется нормально.
Кстати вот один из примеров кода, который я пытался скомпилировать:

Код: Выделить всё

#include <iostream>
using namespace std;
/////////////////////////////////////////////////////////////////////////
struct link
{
    int data;
        link* next;
};
class linklist
{
    private:
        link* first;
    public:
        linklist()
             {first = NULL;}
        ~linklist()
        {
                 link* current;
            while(current != NULL)
            {
                link* temp = current;
                current = current->next;
                delete temp;
            }
        }
        void additem(int d);
        void display();
};
///////////////////////////////////////////////////////////////////////
void linklist::additem(int d)
{
     link* newlink = new link;
    newlink->data = d;
    newlink->next = first;
    first = newlink;
}
///////////////////////////////////////////////////////////////////////
void linklist::display()
{
    link* current = first;
    while(current)
    {
        cout<< current->data<< endl;
        current = current->next;
    }
}
////////////////////////////////////////////////////////////////////////
int main()
{
    linklist li;
    li.additem(34);
    li.additem(345);
    li.additem(29);
    li.additem(15);

    li.display();
    return 0;
}
My god... it's full of stars!...
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Структуры & g++

Сообщение v04bvs »

Всё очень просто, в Linux есть функция link, которая подключается каким-то образом (можете проверить вывод препроцессора), поэтому здесь возникает коллизия имён. Поменяйте link на Link или ещё на что-нибудь и всё будет в порядке.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Структуры & g++

Сообщение serzh-z »

Мой вариант:

Код: Выделить всё

#include <iostream>
using namespace std;
/////////////////////////////////////////////////////////////////////////
namespace my {
struct link
{
    int data;
        link* next;
};
class linklist
{
    private:
        link* first;
    public:
        linklist()
             {first = NULL;}
        ~linklist()
        {
                 link* current;
            while(current != NULL)
            {
                link* temp = current;
                current = current->next;
                delete temp;
            }
        }
        void additem(int d);
        void display();
};
///////////////////////////////////////////////////////////////////////
void linklist::additem(int d)
{
     link* newlink = new link;
    newlink->data = d;
    newlink->next = first;
    first = newlink;
}
///////////////////////////////////////////////////////////////////////
void linklist::display()
{
    link* current = first;
    while(current)
    {
        cout<< current->data<< endl;
        current = current->next;
    }
}
}
////////////////////////////////////////////////////////////////////////
int main()
{
    my::linklist li;
    li.additem(34);
    li.additem(345);
    li.additem(29);
    li.additem(15);

    li.display();
    return 0;
}


Выводит:

15
29
345
34


По рукам бы стучал тем программерам, которые портят область глобальных имён. (Правда мой шеф наоборот, наверное, готов мне руки оторвать за изолирование имён и использование длинных ссылок). :D
Спасибо сказали:
Аватара пользователя
Aectann
Бывший модератор
Сообщения: 3491
Статус: ...
ОС: OS X, GNU_и_не_только/Linux

Re: Структуры & g++

Сообщение Aectann »

v04bvs писал(а):
05.02.2006 19:15
Всё очень просто, в Linux есть функция link, которая подключается каким-то образом (можете проверить вывод препроцессора), поэтому здесь возникает коллизия имён. Поменяйте link на Link или ещё на что-нибудь и всё будет в порядке.

Спасибо, помогло.
P.S. Вот только при исполнении этой программы выкидывает Segmentation fault в конце. С чего бы?
My god... it's full of stars!...
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Структуры & g++

Сообщение serzh-z »

Aectann писал(а):
05.02.2006 21:44
P.S. Вот только при исполнении этой программы выкидывает Segmentation fault в конце. С чего бы?


Кто ж его знает. Предлагаю собрать с "-g3 -O0" и сделать "gdb this-prog" и посмотреть - где хоть sigsegv возникает.

Хотя наиболее вероятно это в ~linklist().
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Структуры & g++

Сообщение v04bvs »

Aectann писал(а):
05.02.2006 21:44
P.S. Вот только при исполнении этой программы выкидывает Segmentation fault в конце. С чего бы?


Вот так попробуйте

Код: Выделить всё

LinkList::~LinkList( )
{
    while( first ) {
        Link *temp = first;
        first = first->next;
        delete temp;
    }
}


Кстати если это не учебный пример, лучше использовать std::list<int> там это всё уже реализовано.
Спасибо сказали:
Аватара пользователя
Aectann
Бывший модератор
Сообщения: 3491
Статус: ...
ОС: OS X, GNU_и_не_только/Linux

Re: Структуры & g++

Сообщение Aectann »

v04bvs писал(а):
06.02.2006 09:10
Aectann писал(а):
05.02.2006 21:44

P.S. Вот только при исполнении этой программы выкидывает Segmentation fault в конце. С чего бы?


Вот так попробуйте

Код: Выделить всё

LinkList::~LinkList( )
{
    while( first ) {
        Link *temp = first;
        first = first->next;
        delete temp;
    }
}


Кстати если это не учебный пример, лучше использовать std::list<int> там это всё уже реализовано.

Помогло, спасибо!
P.S. Про списки из STL я знаю, но пока я С++ только изучаю, так что и пример учебный. :)
My god... it's full of stars!...
Спасибо сказали: