Попытка скомпилировать программу на C

Я сделал простую программу на C и пытаюсь скомпилировать ее с помощью компилятора gcc. Но когда я выполню gcc test.c -o test выдает некоторые ошибки:

test.c:1:19: error: cstdlib: No such file or directory
test.c:2:20: error: iostream: No such file or directory
test.c: In function ‘main’:
test.c:8: error: ‘for’ loop initial declaration used outside C99 mode

И моя C-программа очень проста, поэтому я не думаю, что проблема в коде:

#include <cstdlib>
#include <iostream>

int main(int args, char **argv){
    int result[500];

    for (int i = 0; i < sizeof(result); ++i){
        result[i] = 1;
    }

    return 0;
}

Спасибо!

2 ответа

Решение

Расширение.c означает, что GCC интерпретирует исходные файлы как код C. Ваш заголовок включает в себя заголовки C++, и поэтому компилятор C выдает эти первые две ошибки. Чтобы это исправить, вы можете:

  • Измените расширения файла на .cpp вместо .c, что приведет к тому, что ваш исходный код будет интерпретирован GCC как код C++. В C++ все, что вы написали, действительно.

Или же:

  • Измените первый заголовок, включив в #include <stdlib.h> и удалить #include <iostream>Так как в C. нет точного эквивалента iostream, вам не нужен ни один из этих заголовков для вашей программы, потому что программа очень проста.

Что касается ошибки цикла for, проблема в том, что вы объявили переменную i на этапе инициализации цикла for. Это не разрешено до C99, и поэтому вы можете исправить это, переместив объявление i выше петли.

Так что рабочая программа может выглядеть так:

#include <stdlib.h>
#include <stdio.h>

int main(int args, char **argv){
    int result[500];
    int i;

    for (i = 0; i < sizeof(result)/sizeof(result[0]); ++i){
        result[i] = 1;
    }

    return 0;
}

В этом случае я оставил заголовки включений в программе, хотя они не нужны. stdio.h самый близкий к iostream вы можете попасть в C.

Как отмечают другие, для правильного поведения условие цикла for также должно быть изменено на что-то вроде i < sizeof(result)/sizeof(result[0]),

Это связано с тем, что sizeof при использовании с массивом дает размер массива в байтах, что в зависимости от вашей платформы, скорее всего, будет означать, что вы получили неверное количество итераций в цикле. (Значение int обычно составляет четыре байта, и поэтому, как вы написали его, ваш цикл будет повторяться 2000 раз вместо 500. Делив на размер одного элемента вашего массива, вы получите правильный результат каждый раз.)

Еще лучший подход может быть #define магическое число 500 в начале вашей программы, и обращайтесь к нему таким образом, когда это необходимо.

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

cstdlib и iostream являются заголовочными файлами C++. Для cstdlib вы можете использовать вместо этого stdlib.h. Однако вы не можете использовать iostream, так как iostream - это чистая библиотека ввода-вывода C++. Я думаю, что вы хотите, может быть "stdio.h"

Более того, если вы хотите использовать такую ​​функцию, как объявление переменной "i" в начальной части цикла "for", вы можете скомпилировать свою программу в режиме C99 из-за того, что стандарт языка C до того, как C99 не поддерживает это вид использования.

Чтобы скомпилировать исходный код ac, такой как "ac", в режиме C99, просто добавьте параметр -std=c99 к вашей команде gcc. например: "gcc -std=c99 ac"

Другие вопросы по тегам