Okay, so everyone is speaking about running C programs UNDER an Operating system. This is totally true:
- From the standard point, since the main should return
int
. - From the operating systems point, since the
int
returning from the main is mapped to the exit code of the program.
But no one is speaking of other uncommon conditions that of course can happen when implementing a C program: For example, a C binary that is not being run under any operating system, a C binary that does not return nothing from its main because there is no one to receive or interpret the value, a C binary that actually is the Operating System or a C binary that controls an embedded system where its main function is to synchronize its components inside an infinite loop, waiting for petition (and by definition never returning). The previous examples are more or less equivalent.
In those cases, even if the compiler complains it makes sense to define your main like:
void main()
{
...
}
You have to take warnings seriously, but it is more important to understand what are you actually doing. That is the main caveats of C: With great power comes great responsibility.
If you are under those circumstances, the definition of main does not matter very much since there is no one to call it nor no one to receive its exit value.
Anyway, there is no real concern about the main signature in those circumstances, and optimization does not seem like an improved characteristic of those C programs if they are defined as void main()
or as int main(int argc, char* argv[])
.
So, conclusion:
- When expecting to be run under an operating system (I think this would be true most of the time): Use the standard definition of main
int main(int argc, char* argv[])
. The warning ofgcc
was considered for these circumstances. - When you do not have an operating system: Do as you please, it does not matter, except for the fact of having an annoying warning that does not make sense in those exact circumstances.
Possible Duplicate:
What should main() return in C/C++?
Just started coding C about an hour ago, after a few months of basic java coding, and am encountering a problem compiling the basic hello world program.
Here is my code:
#include < stdio.h>
void main()
{
printf("nHello Worldn");
}
and this is what i get back when i try to compile:
Hello.c: In function ‘main’:
Hello.c:13: warning: return type of ‘main’ is not ‘int’
any help would be much apprecated, thanks!
Evan Carroll
77.3k45 gold badges255 silver badges460 bronze badges
asked Jan 31, 2013 at 21:49
3
The standard signatures for main
are either
int main(void)
or
int main(int argc, char **argv)
Your compiler is simply enforcing the standard.
Note that an implementation may support void main()
, but it must be explicitly documented, otherwise the behavior is undefined. Like dandan78 says, a large number of books and online references get this wrong.
answered Jan 31, 2013 at 21:57
John BodeJohn Bode
119k19 gold badges119 silver badges197 bronze badges
3
it should be
int main() {}
then you should return 0
if the program is terminating correctly or any other number if there was an error. That’s an Unix convention, so scripts can check if the program was terminated correctly or an error occurred.
answered Jan 31, 2013 at 21:51
LtWorfLtWorf
7,2076 gold badges31 silver badges44 bronze badges
2
main-function in c has to return an int:
#include < stdio.h>
int main()
{
printf("nHello Worldn");
return 0;
}
answered Jan 31, 2013 at 21:51
pbhdpbhd
4,3841 gold badge20 silver badges25 bronze badges
Regardless of which prototype you choose for main()
, it’s return value cannot be void
. It has to be int
. Many books and tutorials get this wrong and some compilers tend to complain while others do not.
answered Jan 31, 2013 at 21:51
dandan78dandan78
13.2k13 gold badges64 silver badges78 bronze badges
4
C | ||
|
Добавлено через 5 минут
OKS_by_V, я так понимаю, с английским у тебя неважно…
ошибки:
— много орфографических — сударь, вы пьяны?
— некоторые переменные написаны не так, как объявлены выше.
— в функции список ты делаешь цикл do {} while но не ставишь ; в конце после while.
— забыл #include <stdlib.h> для malloc
— неправильно используешь scanf — для символьных массивов (строк) амперсанд не используется. потому что передается адрес первого элемента — массива (то есть откуда начинается строка).
— для element->sbal необходимо использовать %i или %d
Добавлено через 1 минуту
и кстати, что делает ваш код? к сожалению, в битве экстрасенсов я выбыл в первом раунде
Добавлено через 10 минут
небольшие советы:
— используй чаще клавишу пробел, отделяя элементы.
C | ||
|
— после запятой должен быть обязательно пробел.
C | ||
|
— используй комментарии. это очень важно — приучись к ним.
— называй переменные/функции/объекты/классы и т.д. английскими именами (например read_file)
— по возможности не используй библиотеку #include <conio.h>
В IDE:
— используй автозаполнение и автозавершение слов и функций (в Dev-C++ где-то было). тогда орфографических ошибок не будет.
поищи статьи на тему «красивый код» «стили написания кода» и т.д.
Потому что main должен возвращать int для вашего компилятора/платформы. Но и так работать будет.
aiqu6Ait ★★★★
(05.05.14 03:55:06 MSK)
- Показать ответы
- Ссылка
Ответ на:
комментарий
от aiqu6Ait 05.05.14 03:55:06 MSK
Ответ на:
комментарий
от aiqu6Ait 05.05.14 03:55:06 MSK
Ответ на:
комментарий
от anonymous 05.05.14 03:58:08 MSK
Ответ на:
комментарий
от dvsie 05.05.14 03:59:55 MSK
Ответ на:
комментарий
от dvsie 05.05.14 03:59:55 MSK
Ответ на:
комментарий
от aedeph_ 05.05.14 04:01:24 MSK
Не требует, просто интересно где так «void main» учат начинающих, которые не подозревают зачем вообще из main надо что то возвращать.
anonymous
(05.05.14 04:09:22 MSK)
- Показать ответы
- Ссылка
Ответ на:
комментарий
от anonymous 05.05.14 03:58:08 MSK
Вот сейчас пишу под pic18 для MCC18,
имеет место быть без ошибок, в то же время под Hi-tech там же, если не ошибаюсь, надо писать
aiqu6Ait ★★★★
(05.05.14 04:10:18 MSK)
- Ссылка
Ответ на:
комментарий
от theNamelessOne 05.05.14 04:04:43 MSK
спасибо. обучаюсь немного сам
это был пример из обучающих видео «Специалист»
там MS VS 6 — ворнинг левел 4 стоял и предупреждений не было..
dvsie
(05.05.14 04:12:31 MSK)
- Показать ответы
- Ссылка
Ответ на:
комментарий
от anonymous 05.05.14 04:09:22 MSK
Везде где учат BorlandC и TurboPascal по методичкам конца девяностых.
- Ссылка
Ответ на:
комментарий
от anonymous 05.05.14 04:09:22 MSK
Ответ на:
комментарий
от dvsie 05.05.14 04:16:10 MSK
Ответ на:
комментарий
от dvsie 05.05.14 04:12:31 MSK
Ответ на:
комментарий
от theNamelessOne 05.05.14 04:27:49 MSK
ЗЫ — как у вас тег [код] подсвечивать?
за 2 недели освоил 4 лекции..
Вроде неплохо, иногда задумываюсь о том, что там на винде, ну а у меня debian. разница в компиляторах, потом библиотЭки пойдут.. там и погудим, чувствую xD
поставил нетбинс, но пока хватает гедита и терминала.
с функциями он задачу растянул на пол лекции и как мне показалось слишком уж много вложений было в теле с иф-элсами — запутаться можно, поэтому молча просмотрел, но в некоторых местах удалось таки его опередить, чему и рад немного.
И вот момент — непонятно зачем он math.h заинклюдил?
#include<stdio.h>
#include<math.h>
//прототип - "это функция
int primeNum(int limit);
int max3(int a, int b, int c);
// ф максимум из 3 чисел
// ф вычисления простых чисел
int main(void)
{
//вызов ф
//int c = primeNum(10);
printf("ncount = %dn",primeNum(10));
printf("max=%dn", max3(12,4,7));
return 0;
}
int max3(int a, int b, int c)
{
return (a>b)? (a>c)?a:c :(b>c)?b:c;
}
int primeNum(int limit)
{
//создание переменных
int t, i, count=0, flag;
//проверка всех входных параметров!
if (limit<=0) ;
else
{
printf("1 ");
count++;
//цикл по t - 2-limit
for(t=2;t<=limit;t++)
{ //цикл по i - 2-sqrt(t)
flag=1;
for(i=2;i*i<=t;i++)
{
if (t%i==0)
{
flag=0; break;
}
}
//если простое - печать и count++
if (flag)
{
printf("%4d ", t);
count++;
}
}
}
//возврат кол-ва
return count;
}
dvsie
(05.05.14 05:14:09 MSK)
- Показать ответы
- Ссылка
Ответ на:
комментарий
от dvsie 05.05.14 05:14:09 MSK
ЗЫ — как у вас тег [код] подсвечивать?
[code=c][/code]. И вообще: www.linux.org.ru/wiki/en/Lorcode
И вот момент — непонятно зачем он math.h заинклюдил?
Не знаю.
поставил нетбинс, но пока хватает гедита и терминала. с функциями он задачу растянул на пол лекции и как мне показалось слишком уж много вложений было в теле с иф-элсами — запутаться можно, поэтому молча просмотрел, но в некоторых местах удалось таки его опередить, чему и рад немного.
Да выбрось уже эти видеолекции и почитай лучше какую-нибудь книжку.
- Показать ответ
- Ссылка
Ответ на:
комментарий
от aedeph_ 05.05.14 04:01:24 MSK
Стандарт (пункты 5.1.2.2.1 и 5.1.2.2.3) этого не требует.
Так и ОС не требует, но настоятельно просит предоставить код возврата программы.
- Показать ответ
- Ссылка
Ответ на:
комментарий
от theNamelessOne 05.05.14 05:57:07 MSK
Да выбрось уже эти видеолекции и почитай лучше какую-нибудь книжку.
Нигилизм в чистом виде. Не надо выбрасывать, пока не будет в руках конкретной более качественной книги.
- Показать ответ
- Ссылка
Ответ на:
комментарий
от dvsie 05.05.14 04:16:10 MSK
Потому что писать надо int main(int c, char **v)
И не надо учиться плохому!
А чтобы warning’и игнорировать соблазна не было, советую еще -Werror добавлять.
P.S. И не надо смотреть, как быдлокодеры в мастдайке фигней маются!
☆☆☆☆☆
(05.05.14 12:12:19 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от dvsie 05.05.14 05:14:09 MSK
Ответ на:
комментарий
от quiet_readonly 05.05.14 12:04:21 MSK
более качественной
Ты эти «видеолекции» чутка помотай — это ж вообще жесть какая-то!
☆☆☆☆☆
(05.05.14 12:13:51 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от Eddy_Em 05.05.14 12:13:51 MSK
Интересно, почему же коментарии на русском не устраивают?
А лекции там достаточно хорошие. Всетаки курсы существуют на базе МГТУ Баумана, препод который си ведет — вполне осведомленный, просто он подустал за 8 часов работы и вечером на лекции заинклюдил ненужный хеадер….
Для него мастдайка — работа, тут дело каждого. Скорее, что курс не совсем для новичков, но при желании и это не проблема.
dvsie
(05.05.14 21:58:15 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от dvsie 05.05.14 21:58:15 MSK
почему же коментарии на русском не устраивают?
Потому что это может в привычку войти. И как какой-нибудь нерусский будет твой код читать?
☆☆☆☆☆
(05.05.14 23:27:37 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от quiet_readonly 05.05.14 12:02:33 MSK
clang /tmp/t.c
/tmp/t.c:1:1: error: 'main' must return 'int'
void main(){}
^
1 error generated.
Шланг может и так сказать.
svr4 ☆
(06.05.14 05:16:44 MSK)
- Ссылка
Ответ на:
комментарий
от dvsie 05.05.14 04:12:31 MSK
Зато потом очень забавно пытатся заставить VS 2003 (не говоря уж про более поздние) собрать то говно которое писали в шестёрке по принципу «варингов нет и збс».
библиотЭки пойдут
libc/libm на шиндошсе отличаются мелкими ньюансами (например надо писать «rt» или «rb» вместо «r» в fopen). На самом деле, программы написанные с использованием только стандартных ф-й худо-бедно работают и там и там.
Winsock кстати тоже не то чтобы так уж фатально отличается от православных сокетов из 4.2BSD.
Основная веселуха начинается, когда приходится лезть глубже в потроха системного API (хотя и в этом случае можно побыть ленивой задницей и воспользоватся цигвином при компиляции под винды).
svr4 ☆
(06.05.14 05:22:15 MSK)
- Ссылка
Ответ на:
комментарий
от Eddy_Em 05.05.14 12:12:19 MSK
P.S. И не надо смотреть, как быдлокодеры в мастдайке фигней маются!
Таки у мастдайных программистов тоже так принято.
Deleted
(07.05.14 10:19:04 MSK)
- Ссылка
Ответ на:
комментарий
от Eddy_Em 05.05.14 12:13:18 MSK
P.P.S. Комментарии на русском — это очень плохо.
Eddy_Em
Лол. Наверни koi8r
anonymous
(07.05.14 15:27:43 MSK)
- Ссылка
Ответ на:
комментарий
от Eddy_Em 05.05.14 12:13:18 MSK
Ответ на:
комментарий
от CYB3R 08.05.14 13:56:57 MSK
Это про ЛОР, а не про исходники. Если у тебя в коде комментарии на русском, то выглядеть ты будешь глупо даже среди русскоязычных прогеров.
☆☆☆☆☆
(08.05.14 14:36:02 MSK)
- Показать ответы
- Ссылка
Ответ на:
комментарий
от Eddy_Em 08.05.14 14:36:02 MSK
Eddy_Em
Я — не программист! Помните это.
Eddy_Em
Если у тебя в коде комментарии на русском, то выглядеть ты будешь глупо даже среди русскоязычных прогеров.
Ты сам то не забываешь?)
anonymous
(08.05.14 14:50:41 MSK)
- Ссылка
Ответ на:
комментарий
от Eddy_Em 08.05.14 14:36:02 MSK
Тут я полностью согласен. Названия переменных и комментарии только на английском. По-моему, мы с тобой это уже обсуждали.
CYB3R ★★★★★
(08.05.14 14:56:30 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от CYB3R 08.05.14 14:56:30 MSK
Воn так лучше будет
#include <stdlib.h>
int main() {
/* программа */
return EXIT_SUCCESS;
}
Это для простеньких случаев когда фейлов не ожидается (или фейлы сами остановят программу).
Последние 8 бит (или первые, зависит от порядка байт) того, что возвращает main — будут кодом выхода из программы. И если этот код не равен системному EXIT_SUCCESS, то в общем случае это значит, что программа завершилась с ошибкой.
В С99 вроди как уже по умолчанию компилятор в конец ставит пропущенный return EXIT_SUCCESS;
. Но для понимания процесса лучше указывать явно.
KennyMinigun ★★★★★
(08.05.14 15:05:15 MSK)
Последнее исправление: KennyMinigun 08.05.14 15:08:27 MSK
(всего
исправлений: 1)
- Ссылка
Ответ на:
комментарий
от anonymous 05.05.14 04:09:22 MSK
Не требует, просто интересно где так «void main» учат начинающих, которые не подозревают зачем вообще из main надо что то возвращать.
_любая_ программа что-то должна возвращать. Тут дело даже не в сишке.
emulek ★
(08.05.14 15:48:02 MSK)
- Ссылка
Ответ на:
комментарий
от dvsie 05.05.14 05:14:09 MSK
зачем он math.h заинклюдил?
для функции sqrt(3)
SQRT(3) Linux Programmer's Manual SQRT(3)
NAME
sqrt, sqrtf, sqrtl - square root function
SYNOPSIS
#include <math.h>
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);
Link with -lm.
emulek ★
(08.05.14 15:50:32 MSK)
- Ссылка
Ответ на:
комментарий
от Eddy_Em 05.05.14 12:13:18 MSK
Комментарии на русском — это очень плохо.
лучше на русском, чем на кривом английском.
emulek ★
(08.05.14 15:52:05 MSK)
- Показать ответы
- Ссылка
Ответ на:
комментарий
от emulek 08.05.14 15:52:05 MSK
Ответ на:
комментарий
от emulek 08.05.14 15:52:05 MSK
лучше на русском, чем на кривом английском.
Нет.
Dudraug ★★★★★
(08.05.14 16:50:11 MSK)
- Ссылка
Ответ на:
комментарий
от Eddy_Em 08.05.14 16:43:50 MSK
ох… Диванный теоретик… Какой-нить испанский можно хоть в гуглотранслятор засунуть. А вот кривой английский от русских даже англичанин не распарсит. Смысл в таком комментарии?
emulek ★
(08.05.14 18:49:45 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от emulek 08.05.14 15:52:05 MSK
Не, лучше таки кривой английский. И русский может понять, транслируя слова из английского в русский, и нерусский при желании.
derlafff ★★★★★
(08.05.14 19:04:39 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от emulek 08.05.14 18:49:45 MSK
Вероятность того, что кто угодно поймет кривой английский, значительно выше вероятности, что кто-то будет выдирать из кода комментарии, переводить гуглопереводчиком и пытаться перевести то, что «напереводил» гугол.
☆☆☆☆☆
(08.05.14 19:05:43 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от derlafff 08.05.14 19:04:39 MSK
Не, лучше таки кривой английский.
для тебя — может быть. А я в гробу видал поддерживать такой код.
emulek ★
(08.05.14 21:20:32 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от Eddy_Em 08.05.14 19:05:43 MSK
программа должна быть так написана, что-бы и без комментариев было понятно что к чему.
А комменты ИМХО это просто заметки в коде, TODO и прочее такое.
А твой код без комментариев не понять?
emulek ★
(08.05.14 21:24:08 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от emulek 08.05.14 21:20:32 MSK
для тебя — может быть
не для меня, а для всех. а код лучше, от того, что этот горе-разработчик напишет на русском, а не на корявом английском, не станет
derlafff ★★★★★
(08.05.14 21:59:41 MSK)
- Ссылка
Ответ на:
комментарий
от emulek 08.05.14 21:24:08 MSK
Ты хочешь сказать, что у тебя такой код, что никаких комментариев не надо? Что делает функция, что за параметры в нее передаются, описание полей структур, описание хитрожопых алгоритмов и т.д., и т.п.
☆☆☆☆☆
(08.05.14 22:01:56 MSK)
- Показать ответы
- Ссылка
Ответ на:
комментарий
от Eddy_Em 08.05.14 22:01:56 MSK
Ты хочешь сказать, что у тебя такой код, что никаких комментариев не надо? Что делает функция, что за параметры в нее передаются, описание полей структур, описание хитрожопых алгоритмов и т.д., и т.п.
У Батти, скорее всего, такой код, что даже и с комментариями не разобраться.
А ваще, комментарии нужны чтобы:
- Писать документацию на API, из которой потом доксиген генерирует маны.
- Оставлять примечания о хитрожопых алгоритмах и формулах предметной области и ссылки на пейперы с их описанием. Алсо, иногда приходится делать заметки об особенностях оптимизации.
- Записывать по ходу дела TODO, чтоб потом можно было погрепать и занести в багтрекер.
Больше ни для чего не нужны.
anonymous
(09.05.14 07:48:10 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от theNamelessOne 05.05.14 04:04:43 MSK
тогда нужно приписать std=c99 при компиляции
Andersen ★★
(09.05.14 09:01:04 MSK)
- Ссылка
Ответ на:
комментарий
от Eddy_Em 08.05.14 22:01:56 MSK
Ты хочешь сказать, что у тебя такой код, что никаких комментариев не надо
это идеал, к которому я стремлюсь.
Что делает функция, что за параметры в нее передаются, описание полей структур
имена зачем придумали? Ну если ты функции называешь ghfdjh(int jhd, float ***qweq), то да, комментарии нужны.
описание хитрожопых алгоритмов и т.д.
это в коде всё равно не лепится. Проще ссылку дать на этот алгоритм, а само описание найти/написать в Сети.
emulek ★
(09.05.14 17:00:51 MSK)
- Показать ответ
- Ссылка
Ответ на:
комментарий
от anonymous 09.05.14 07:48:10 MSK
У Батти, скорее всего, такой код, что даже и с комментариями не разобраться.
![]()
это смотря кому. Мне — нормально. А про 95% я как-то не думал.
emulek ★
(09.05.14 17:02:10 MSK)
- Ссылка
Ответ на:
комментарий
от emulek 09.05.14 17:00:51 MSK
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Solution 1
The standard signatures for main
are either
int main(void)
or
int main(int argc, char **argv)
Your compiler is simply enforcing the standard.
Note that an implementation may support void main()
, but it must be explicitly documented, otherwise the behavior is undefined. Like dandan78 says, a large number of books and online references get this wrong.
Solution 2
it should be
int main() {}
then you should return 0
if the program is terminating correctly or any other number if there was an error. That’s an Unix convention, so scripts can check if the program was terminated correctly or an error occurred.
Solution 3
main-function in c has to return an int:
#include < stdio.h>
int main()
{
printf("nHello Worldn");
return 0;
}
Related videos on Youtube
26 : 48
xv6 Kernel-13: entry.S + start.c
01 : 49
12 : 03
#15 how to return a value from a function | return type in c | return int | return type function
08 : 51
Learning C Language — About Problems Error, Exception and Warning
07 : 57
Three Ways to Reverse The Letters In An Excel Cell — 2391
03 : 46 : 13
C Programming Tutorial for Beginners
00 : 55
C/C++ VISUAL STUDIO CODE (1d returned error)//WINDOWS 10
22 : 13
10 Warning Signs You Already Have Dementia
35 : 23
What Happens If You Don’t Eat For 5 Days?
01 : 04
Why does (0 == Hello) return true in PHP — PHP
Comments
-
Possible Duplicate:
What should main() return in C/C++?Just started coding C about an hour ago, after a few months of basic java coding, and am encountering a problem compiling the basic hello world program.
Here is my code:
#include < stdio.h> void main() { printf("nHello Worldn"); }
and this is what i get back when i try to compile:
Hello.c: In function ‘main’: Hello.c:13: warning: return type of ‘main’ is not ‘int’
any help would be much apprecated, thanks!
-
Get a better book or tutorial:
void main
is incorrect — it should beint main
. (Unfortunately there are some bad books on C out there which usevoid main
and you will often see this perpetuated in code examples on the web).
-
-
The return type of
main
could bevoid
as well as anything else, it’s implementation-defined whether a signature is valid or not, and its behavior could be unspecified. -
thanks for this, any idea where i’d be able to find an accurate tutorial/beginners guide to C online? After looking through a couple have realised a lot make this mistake.
-
@JoePerkins: I don’t personally know of a good online tutorial or guide for beginners; all the ones I’ve seen are pretty wretched. However, there is the comp.lang.c FAQ, which is pretty good, and the latest language standard is available here. Neither is the greatest learning resource, but they at least don’t lead you astray.
-
@JoePerkins buy a good book, you can find a list in the information page of the c tag here on SO.
-
The standard says
#include <stdlib.h>
….exit(EXIT_SUCCESS)
orexit(EXIT_FAILURE)
-
What sandard says that? Usually different values for the exit codes are used so that is possible to distinguish between errors.
-
@effeffe Sorry to revive post on an old question but C++ standard section 3.6.1.2 states «An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main :
int main() {/∗. . .∗/}
andint main(int argc , char* argv[]) {/∗. . .∗/}
-
@jodag this question is about C, not C++.
-
@effeffe Oops, I was reading the «possible duplicate» section and saw C/C++ so assumed it was pertaining to C++ as well. My bad.