Та же программа выдает ошибку компилятора в одном компиляторе, а не в другом - PullRequest
1 голос
/ 29 апреля 2019

Я изучаю Учиться кодировать с C Саймона Лонга. https://www.raspberrypi.org/magpi-issues/Essentials_C_v1.pdf на странице 20 есть эта простая программа:

#include <stdio.h>
void main (void)
 {
  int a = 0;
  while (a < 5)
{
  printf ("a is equal to %d\n", a);
  a++;
}
  printf ("a is equal to %d and I've finished\n", a);
}

Но когда я компилирую это, я получаю эту ошибку компилятора:

while-loop.c:3:1: warning: return type of 'main' is not 'int'
  [-Wmain-return-type]
void main(void)
^
while-loop.c:3:1: note: change return type to 'int'
void main(void)
^~~~
int
1 warning generated.

Почему это? Похоже, авторский компилятор не выдает ошибку за это. Почему расхождение?

Когда я меняюсь

void main (void) 

до

int main (void)

отлично компилируется.

1 Ответ

3 голосов
/ 29 апреля 2019

За 5.1.2.2.1 Запуск программы , параграф 1 стандарта C (шахтное производство):

Функция, вызываемая при запуске программы, называется основной. реализация не объявляет прототип для этой функции. Это должно быть определяется с типом возврата int и без параметров:

     int main(void) { /* ... */ }

или с двумя параметрами (именуемыми здесь как argc и argv, хотя любой имена могут использоваться, так как они являются локальными для функции, в которой они находятся объявившего):

     int main(int argc, char *argv[]) { /* ... */ }

или эквивалентный; или другим способом, определяемым реализацией.

Хотя void main() подходит "или каким-либо другим образом, определяемым реализацией", на мой взгляд, конкретное расширение, специфичное для реализации, такое как, не относится к тексту новичка без хотя бы некоторого объяснения, поскольку оно будет только привести к путанице позже.

По крайней мере, найдите книгу, в которой глаза не болят так сильно.

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