Синтаксическая ошибка отсутствие перед тип

I am new to programming C.. please tell me what is wrong with this program, and why I am getting this error: error C2143: syntax error : missing ';' before 'type'.... extern void func(); int main...

I am new to programming C.. please tell me what is wrong with this program, and why I am getting this error: error C2143: syntax error : missing ‘;’ before ‘type’….

extern void func();

int main(int argc, char ** argv){
    func();
    int i=1;
    for(;i<=5; i++) {
        register int number = 7;
        printf("number is %dn", number++);
    }
    getch();
}

asked Mar 29, 2013 at 4:10

eLg's user avatar

8

Visual Studio only supports C89. That means that all of your variables must be declared before anything else at the top of a function.

EDIT: @KeithThompson prodded me to add a more technically accurate description (and really just correct where mine is not in one regard). All declarations (of variables or of anything else) must precede all statements within a block.

answered Mar 29, 2013 at 4:17

Ed S.'s user avatar

Ed S.Ed S.

122k21 gold badges181 silver badges262 bronze badges

2

I haven’t used visual in at least 8 years, but it seems that Visual’s limited C compiler support does not allow mixed code and variables. Is the line of the error on the declaration for int i=1; ?? Try moving it above the call to func();

Also, I would use extern void func(void);

answered Mar 29, 2013 at 4:18

Randy Howard's user avatar

Randy HowardRandy Howard

2,16015 silver badges26 bronze badges

this:

int i=1;
for(;i<=5; i++) {

should be idiomatically written as:

for(int i=1; i<=5; i++) {

because there no point to declare for loop variable in the function scope.

answered Mar 29, 2013 at 4:17

lenik's user avatar

leniklenik

23k4 gold badges32 silver badges43 bronze badges

8

Нет, не помогает. И если добавить к коду строку int* rowX=*x; вот так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
 
#define n   ( 4 )
 
void set_mem( int **x ) {
 
    *x = malloc( sizeof( int ) * n );
    int* rowX=*x;//Строка с ошибкой
}
 
int main () {
 
    int *x;
    unsigned short i = n;
 
    set_mem( &x );
 
    while ( i-- ) {
        x[ i ] = i;
        printf( "%3d", x[ i ] );
    }
 
    free( x );
    return 0;
}

, то Ваш код тоже не компилится

Добавлено через 1 минуту
И stdlib.h не помогает

Добавлено через 16 минут
Вот так вроде компилится:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
#include "filesIO.h"
 
int readIn(char* inNm, float** X, int* N, int* M)
{
    FILE* FL=fopen(inNm,"r");
    if(FL)
    {
        if (fscanf(FL,"#begin filen")==EOF)
        {
            fclose(FL);
            return 1;
        }
        else
        {
            if (fscanf(FL,"N=%u;n",N)==EOF)
            {
                fclose(FL);
                return 1;
            }
            else
            {
                if (fscanf(FL,"M=%u;n",M)==EOF)
                {
                    fclose(FL);
                    return 1;
                } 
                else
                {                   
                    if (fscanf(FL,"x[i]:n")==EOF)
                    {
                        fclose(FL);
                        return 1;
                    } 
                    else
                    {   
                        float* rowX=malloc(sizeof(float)*(*N-1));
                        *X=rowX;                        
                        /*
                        for (int xCnt=0; xCnt<=*N-1; xCnt++)
                        {
 
                        }
                        */
                    }
                }
            }
        }
    }
    else
    {
        return 1;
    }
}

Но почему не компилился первый вариант, я так и не понял. Только поменял строчки местами, и всё…

Добавлено через 2 минуты
Хотя наверно лучше всё-таки писать float* rowX=(float*)malloc(…) для совместимости с C++

Добавлено через 13 минут
Но когда я продолжил код, начав работать с rowX, снова компилятор стал выёживаться:

C
1
2
3
4
5
6
7
8
9
10
11
                        float* rowX=(float*)malloc(sizeof(float)*(*N-1));
                        *X=rowX;                        
                        for (int xCnt=0; xCnt<=*N-1; xCnt++)
                        {                           
                            if(fscanf(FL,"%f;n",rowX)==EOF)
                            {
                                fclose(FL);
                                return 1;
                            }                           
                            rowX++;
                        }

Ошибка 6 error C2143: синтаксическая ошибка: отсутствие «;» перед «тип» d:documents¦ storeprogrammingvisual studio 2010vasesvasesfilesio.c 40 1 Vases
Ошибка 7 error C2143: синтаксическая ошибка: отсутствие «;» перед «тип» d:documents¦ storeprogrammingvisual studio 2010vasesvasesfilesio.c 40 1 Vases
Ошибка 8 error C2143: синтаксическая ошибка: отсутствие «)» перед «тип» d:documents¦ storeprogrammingvisual studio 2010vasesvasesfilesio.c 40 1 Vases
Ошибка 9 error C2143: синтаксическая ошибка: отсутствие «;» перед «тип» d:documents¦ storeprogrammingvisual studio 2010vasesvasesfilesio.c 40 1 Vases
Ошибка 10 error C2065: xCnt: необъявленный идентификатор d:documents¦ storeprogrammingvisual studio 2010vasesvasesfilesio.c 40 1 Vases
Ошибка 12 error C2065: xCnt: необъявленный идентификатор d:documents¦ storeprogrammingvisual studio 2010vasesvasesfilesio.c 40 1 Vases
Ошибка 13 error C2059: синтаксическая ошибка: ) d:documents¦ storeprogrammingvisual studio 2010vasesvasesfilesio.c 40 1 Vases
Ошибка 14 error C2143: синтаксическая ошибка: отсутствие «;» перед «{» d:documents¦ storeprogrammingvisual studio 2010vasesvasesfilesio.c 41 1 Vases

Добавлено через 11 минут
Даже такой код не компилится

C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    printf("Hello, world!n");
    float* x=(float*)malloc(8);
}

Ошибка 1 error C2143: синтаксическая ошибка: отсутствие «;» перед «тип» d:documents¦ storeprogrammingvisual studio 2010vasesvasesmain.c 7 1 Vases

Добавлено через 1 час 13 минут
Вот, нашёл в MSDN решение проблемы. Оказывается, микрософтовские разработчики решили спародировать Delphi, цитата:

В программе C переменные необходимо объявлять в начале функции; после того, как функция выполняет не связанные с объявлением инструкции, объявлять переменные нельзя.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
// C2143j.c
 
int main() 
 
{
 
 int i = 0;
 
 i++;
 
 int j = 0; // C2143
 
}

Вот с учётом этого я переписал код так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <stdlib.h>
#include "filesIO.h"
 
int readIn(char* inNm, float** X, int* N, int* M)
{
    FILE* FL=fopen(inNm,"r");
    if(FL)
    {
        if (fscanf(FL,"#begin filen")==EOF)
        {
            fclose(FL);
            return 1;
        }
        else
        {
            if (fscanf(FL,"N=%u;n",N)==EOF)
            {
                fclose(FL);
                return 1;
            }
            else
            {
                if (fscanf(FL,"M=%u;n",M)==EOF)
                {
                    fclose(FL);
                    return 1;
                } 
                else
                {
                        
                    if (fscanf(FL,"x[i]:n")==EOF)
                    {
                        fclose(FL);
                        return 1;
                    } 
                    else
                    {
                        float* rowX;
                        int xCnt;
                        *X=(float*)malloc(sizeof(float)*(*N-1));                        
                        rowX=*X;                        
                        for (xCnt=0; xCnt<=*N-1; xCnt++)
                        {
                            if(fscanf(FL,"%f;n",rowX)==EOF)
                            {
                                fclose(FL);
                                free(*X);
                                return 1;
                            }
                            rowX++;
                        }
                        fclose(FL);
                        return 0;
                    }
                }
            }
        }
    }
    else
    {
        return 1;
    }
}

И если переменную цикла объявлять прямо в цикле или присваивать значение rowX после начала других операций, даже не связанных с этой, он будет ругаться. Да, неисповедимы пути микрософта по втыканию палок в колёса труда программистов…

Добавлено через 6 минут
http://msdn.microsoft.com/ru-r… .100).aspx



0



Guru

Qraizer



Сообщ.
#11

,
08.08.20, 12:24

    Moderator

    *******

    Рейтинг (т): 520

    Цитата Виталь @ 08.08.20, 10:40

    Вот кусок кода

    Пример кода неверный. Плохо соответствует реальному. Сделай, плз, ещё раз, но без ошибок. Если судить по тексту сообщения, то этот if() должен быть внутри лябмды, но там даже лямбда неправильно определена, её по сути нет. Компилер должен был бы стопнуться ещё на её заголовке.

    Цитата Виталь @ 08.08.20, 11:17

    В оригинале был GetModuleHandle, но он выдает error C2664: GetModuleHandleW: невозможно преобразовать параметр 1 из «const char *» в «LPCWSTR» (независимо от того, стоит ли в свойствах использование юникода)

    Так не бывает. Значит ты либо неправильно сказал использовать ANSI, либо подключил не те заголовки, если они от какой-нибудь сторонней либы, либо эта либа просто расчитана исключительно на юникод

    Добавлено 08.08.20, 12:26

    Цитата OpenGL @ 08.08.20, 10:44

    Это какое-то бесполезное использование auto. В данном случае оно ничего не сокращает. Пиши тупо std::vector<int> var123; и всё

    Вообще не понимаю апологетов нового стиля инициализаторов. Везде суют {}, что только с толку сбивает.

    Добавлено 08.08.20, 12:54
    P.S. VS2019 всё ещё умеет работать на любых Win7 с SP1. Что касается требуемых объёмов, тот тут всё зависит от набора компонентов. У меня стоит 2017 на ~20Гб, в которые включены базовые средства для C# и VB, отладчик JIT, инструменты статического и динамического анализа, наборы заголовков и библиотек для создания приложений под XP и API в совокупности трёх версий (ещё 7 и 8.1), плагины для полноценной поддержки GPU, библиотеки MFC и ATL (так ни разу и не воспользовался), RTL четырёх вариантов (статические/динамические, релиз/дебаг, естественно включая и упомянутые MFC с ALTем + ешё раз то же самое за ANSI/UNICODE для них) под три целевые исполнительные платформы x32, x64 и ARM с исходниками + беззаголовочные варианты при поддержке модулей, средства разработки под Android и два его эмулятора и Python обоих разрядностей.

    Сообщение отредактировано: Qraizer — 08.08.20, 13:14

    Чистый код написания языка C, обратите внимание, что это не сторона декларации. По сути, чисто C требует местных переменных определений для начала функции или части локального пространства, а затем могут быть другие утверждения. Чисто C требует местоположения переменной декларации, C ++ можно использовать в соответствии с определенным. Обратите внимание, что VS строго выполняет чистый стандарт C. Переменная произвольно определяется как стандарт C99. Это стандарт C89, а C99 не имеет этого предела. Проблема в том, что Microsoft отказалась поддержать C99 (включая VS2012), стиль IE6 в этом году. Вы можете использовать параметр / TP для компиляции программы в качестве кода C ++, вы можете пройти. Или нет проблем вообще, потяните int b на вершину, просто отлично.

    В чистом C окружающей среде, протокол до нескольких минут, вы будете предстоит подозревать, что вы не будете писать процедуры, слишком много общих библиотек и классов нельзя использовать, даже некоторые распространенные «свободные выражения», все это неправильно в минутах.

    Я просто хочу написать чисто C в против, следует сказать, что он написан в .CPP, я думаю, что этот код в порядке, в соответствии со стандартной средой Chile C, измените его на .C, чтобы увидеть, может ли он работать , Я этого не ожидал. Это такой простой код, даже просто выученный C языка C, и даже кодовые книги, которые можно увидеть, чтобы выбираться на языке детскую обувь.

     
    1. #include<stdio.h>

    2. void main(){

    3. int a=1;

    4. printf("%d",a);

    5. int b=2;

    6. printf("%d",b);

    7. }

    На самом деле, после .CPP был составлен, а после наручников, после VS2010, VS2010 он сообщил об этом:

    Тогда я достаточно широкий мой титановый сплава, я нашел его не так не в штате сегодня, даже точку с запятой, я не играл его, но intimiNth 5-я строка, что int b = 2; просто есть с запятой.

    Тогда скажите мне, что B не объявлен идентификатором? Привет,? ? ? Я не могу видеть это ясно, но у вас есть int, три английского до этого B. ? ?

    Ранее необъяснимое предупреждение, «[C] выводит количество m ~ n выводит количество SCANF для языка VS2005 или выше к языку C4996″ (Нажмите, чтобы открыть ссылку), Вы можете компилировать, вы можете работать нормально, и C языком не в день. Теперь у вас нет такой простой программы, вам не нужно компилировать.

    Так же, как у вас есть определение всех локальных переменных, вы можете написать код. Как следует, нет проблем с проблемой:

    1. #include<stdio.h>

    2. void main(){

    3. int a=1;

    4. int b=2;

    5. printf("%d",a);

    6. printf("%d",b);

    7. }

    Как показано ниже:

    Понравилась статья? Поделить с друзьями:
  • Синий экран смерти расшифровка ошибок
  • Синтаксическая ошибка определение
  • Синий экран ошибка stopcode
  • Синтаксическая ошибка ожидается операнд неверный маркер
  • Синий экран ошибка registry error