Странная C программа - PullRequest
5 голосов
/ 12 ноября 2009

Проверьте следующий фрагмент кода

struct st
{
    struct st
    {
        int a ;
        int b ;
    } st;

    int a1 ;
} ;

struct st obj ;
struct st obj1 ;

int main()
{
    return obj.a1 + obj1.b ;
}

Компилятор Microsoft Visual Studio 6.0 успешно компилирует программу. Я запутался с использованием 'struct st'. Каков размер obj и obj1?

Ответы [ 4 ]

8 голосов
/ 12 ноября 2009

GCC дает

ошибка: вложенное переопределение "struct st"
ошибка: в структуре st нет члена с именем a1

Если VC6 компилирует это, это нормально, но это неверно.

Если вы хотите узнать размер объекта obj, это sizeof obj. Я бы предположил, что VC6 просто выровнял структуру и присвоил ей три дюйма.

1 голос
/ 12 ноября 2009

Просто беглый взгляд на это заставляет меня думать, что вы определили одну структуру, объявили две переменные типа struct. Следовательно, sizeof (obj) и sizeof (obj1) должны быть одинаковыми, поскольку они оба имеют тип st! Излишне говорить, что вложенные структуры с тем же именем незаконны! И удивился, что это скомпилировано. Но помните, что C изменился с тех пор, как вышел VC 6 (если мне не изменяет память).

1 голос
/ 12 ноября 2009

Размеры obj и obj1 одинаковы. Значение obj.a1 + obj1.b не определено, поскольку ни один из них не был инициализирован И Ваш код И компилятор не работает. Если это действительно БИЛЕТ, все ставки отменены.

Примечание:

Этот код получил МНОГО ' справки ' от своего компилятора, чтобы он действительно работал. Под «помощью» я подразумеваю: «У нас есть крайний срок, чтобы вытолкнуть это ... его время обработки ошибок, особенно в том, что касается анализатора!»

0 голосов
/ 12 ноября 2009

Это недопустимый код C. В Си нет «класса», и с точки зрения языка Си оба определения struct st определяют один и тот же тип дважды. Это незаконно.

Это только правильно сформировано как код C ++, но кроме этого программа просто вычисляет и возвращает 0. Почему она перепрыгивает через все эти обручи, чтобы вернуть 0, вне меня. Программа больна -сформировался как C ++. Недопустимо объявлять класс st членом класса st (то есть с тем же именем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...