Почему этот онлайн-компилятор позволяет мне компилировать код, даже если функции не объявлены раньше основного? - PullRequest
0 голосов
/ 24 декабря 2018

онлайн-компилятор: https://www.onlinegdb.com/online_c_compiler#

Почему этот компилятор позволяет мне компилировать код без функций перед основной функцией?Разве это не должно быть ошибкой?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Компиляторы C часто по умолчанию используют более ранний, чем последний, стандарт языка C и легко справляются с ошибками, которые исторически допускались языком.

Ваша ошибка - одна из тех, которые были обычным юридическим кодом 30 лет назад.

Вы хотите специально и явно проинструктировать ваш компилятор быть строгим с вашим кодом, предоставив соответствующие опции.Для относительно недавней сборки gcc это будет -std=c11 -Wall -Werror или подобный набор опций.

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

0 голосов
/ 24 декабря 2018

В старом C существовала вещь, называемая неявным объявлением функции.Когда появился вызов необъявленной функции, предполагалось, что она имеет тип int(), то есть функцию, которая принимает неопределенное количество параметров и возвращает int.

int main()
{
    foo(); // foo is implicitly declared as `int foo()`
}

Начиная с C99 это недопустимо,Включите предупреждения компилятора и используйте правильный языковой диалект.

Есть еще такие причуды из старости.Например, вы можете объявить аргументы функции без типа, а тип будет неявным int:

int test(a) // a type is implicitly int
{
    a = 11;

    return a;
}

Вышеприведенное даже не генерирует никаких предупреждений, если не используется -pedantic

Если вы хотите сойти с ума, скомпилируйте это:

double test(a, b)
    int a;
    double b;
{
    a = 11;
    b = 3.14;

    return a + b;
}

Это старый способ (время K & R) объявления переменных, и я не нашел никаких флагов, чтобы вызвать предупреждение.

Так что да, старый Си странный и находит способ проникнуть даже сегодня.

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