Почему это не компиляция - PullRequest
       0

Почему это не компиляция

0 голосов
/ 30 сентября 2010
#include <stdio.h>

typedef struct point{
    int x; 
    int y;
};

void main (void){

    struct point pt;
    pt.x = 20;
    pt.y = 333;

    struct point pt2;
    pt2.y = 55;

    printf("asd");
    return;
}

VS 2008

c:\documents and settings\lyd\mis documentos\ejercicio1.c\ejercicio1.c\ejercicio1.c(14) : error C2143: syntax error : missing ';' before 'type'
c:\documents and settings\lyd\mis documentos\ejercicio1.c\ejercicio1.c\ejercicio1.c(15) : error C2065: 'pt2' : undeclared identifier
c:\documents and settings\lyd\mis documentos\ejercicio1.c\ejercicio1.c\ejercicio1.c(15) : error C2224: left of '.y' must have struct/union type
Build log was saved at "file://c:\Documents and Settings\LYD\Mis documentos\ejercicio1.c\ejercicio1.c\Debug\BuildLog.htm"
ejercicio1.c - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ответы [ 4 ]

3 голосов
/ 30 сентября 2010

Поскольку вопрос помечен C (а не C ++) и компилятор MSVC 2008, вы застряли в семантике C89. Это означает, что вы не можете объявлять переменные в блоке после первого оператора. Следовательно, вторая переменная структуры там не разрешена. (И C99, и C ++ позволяют объявлять переменные в любой точке блока. Попросите MS обновить компилятор C для поддержки C99.)

Ваша другая ошибка заключается в том, что main() возвращает int, следовательно:

#include <stdio.h>

struct point
{
    int x; 
    int y;
};

int main (void)
{
    struct point pt;
    struct point pt2;
    pt.x = 20;
    pt.y = 333;
    pt2.x = 4;
    pt2.y = 55;
    printf("asd");
    return 0;
}

Несколько часов спустя : ключевое слово typedef не требуется в коде, поскольку после закрывающей скобки и перед точкой с запятой имя не указывается. Это не останавливает компиляцию; это вызовет предупреждение с установленным компилятором fussy.

3 голосов
/ 30 сентября 2010

Он прекрасно компилируется на моем gcc 4.4.3.

Однако вы пытаетесь определить новый тип:

typedef struct point{
    int x; 
    int y;
};

, но, кажется, вы забыли назвать этот новый тип (я просто назову его point_t ):

typedef struct point{
    int x; 
    int y;
} point_t;

Позже в вашем коде вы можете использовать его следующим образом:

point_t pt;
pt.x = 20;
pt.y = 333;
3 голосов
/ 30 сентября 2010

Удалить слово typedef.

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

Попробуйте переместить объявление pt2 в начало функции. Некоторые компиляторы C требуют, чтобы объявления были либо глобальными, либо в начале блока кода.

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