Попытка скомпилировать программу на 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"