почему int main(anything_you_type) не выдает никаких ошибок?

Здесь я написал свое имя в объявлении основного аргумента, но эта программа все равно работает и не выдает никаких предупреждений.

#include <stdio.h>
int main(Mr32) 
{
    printf("why this works?");
    return 0;
}

Всякий раз, когда я пишу что-нибудь вместо mr32, код все еще работает. Я действительно не знаю, почему это происходит. Согласно стандарту программирования C, это неправильно, верно?

Редактировать: я попробовал -Wall, но он не выдает никаких предупреждений.

Я думаю, что здесь должна быть ошибка, потому что я не делаю стандартное объявление определения функции C

В языке c каждое определение функции должно соответствовать этому формату

return-type function_name ( arg_type arg1, ..., arg_type argN ); 

Это также должно применяться к main() справа ..??

Хорошо — Wextra показывает предупреждение о том, что mr32 по умолчанию — int.

Тогда почему по умолчанию любой аргумент в main() имеет тип int?


person Jeegar Patel    schedule 27.09.2011    source источник
comment
Увеличьте уровень предупреждений вашего компилятора и следите за предупреждениями   -  person pmg    schedule 27.09.2011
comment
К тому же отсутствующий #include <stdio.h> gcc не жалуется даже с -Wall. Только с -Wextra он жалуется на Mr32 по умолчанию на int. Вопрос больше касается основных аргументов по умолчанию: какая спецификация определяет, что тип основных по умолчанию равен int?   -  person Matteo    schedule 27.09.2011
comment
@pmg: да gcc -Wextra жалуется. Но вопрос: почему предупреждение, а не ошибка? Почему по умолчанию используется int? Где и как это указано?   -  person Matteo    schedule 27.09.2011
comment
@ Маттео, спасибо, братан... ты понял мой вопрос..   -  person Jeegar Patel    schedule 27.09.2011
comment
попробуй gcc -std=c89 -pedantic -Wall -Wmissing-parameter-type -Wold-style-definition. 1-е предупреждение включено в -Wextra; 2-й изолирован.   -  person pmg    schedule 27.09.2011
comment
@Matteo: это указано в 3.5.4.3 C89, что позволяет использовать identifier-list вместо parameter-type-list. Я не уверен, что стандарт явно указывает в нормативном тексте, что параметры тогда предполагаются равными int, или это просто следует из того факта, что любая переменная в C89 по умолчанию является int (то есть auto a; определяет автоматическую переменную это int), но в 3.7.1 есть пример, в котором упоминается, что int используется по умолчанию для таких параметров функции.   -  person Steve Jessop    schedule 27.09.2011


Ответы (3)


В определении K&R C параметр без типа по умолчанию имеет значение int. Тогда ваш код соответствует

int main( int Mr32 ) {
    printf("why this works?");
    return 0;
}

Взгляните на этот ответ для получения подробной информации: синтаксис функции C, типы параметров, объявленные после списка параметров

Обновить

Подводя итог: в C89 по-прежнему поддерживаются объявления K&R.

  • необъявленные типы параметров по умолчанию имеют значение int

    void foo( param )
    

    по умолчанию

    void foo( int param )
    
  • неуказанные возвращаемые типы по умолчанию равны int

    foo()
    

    по умолчанию

    int foo()
    

Примечание

Хотя это поддерживается, я бы никогда его не использовал: код должен быть читабельным

person Matteo    schedule 27.09.2011
comment
кажется, что компилятор обрабатывает функцию main() не так, как функцию normalmail.../! - person Jeegar Patel; 27.09.2011
comment
в обычном определении функции вы не можете писать как int f00 (mr32){ } - person Jeegar Patel; 27.09.2011
comment
@Mr.32 Mr.32 Маттео говорит вам, что да вы можете. (но это будет зависеть от того, какой стандарт C следует вашему компилятору). - person nos; 27.09.2011
comment
@ Mr.32: определение стиля K&R применяется для каждой функции. Вы можете написать void foo(varname). - person Matteo; 27.09.2011
comment
@Mr.32 в c89, int foo(bar,baz) совпадает с int foo(int bar,int baz); Это означает, что если вы не указываете тип параметрам функции, параметры неявно обрабатываются как int. Это функция, перенесенная из K&R C, которая была стандартом до C89. То же самое для возвращаемого типа функции, если вы опустите его, по умолчанию будет использоваться значение int. - person nos; 27.09.2011
comment
+1 Маттео, я думаю, что получил свой ответ ... вы должны обновить свой ответ каким-нибудь примером ..! - person Jeegar Patel; 27.09.2011
comment
@ Маттео, круто ... теперь я приму твой ответ ..! люди обычно не читают комментарии, так что теперь они получат ответ по вашим обновлениям. Спасибо - person Jeegar Patel; 27.09.2011
comment
Поскольку вы говорите C89, этот вид кода устарел в C99? - person Lundin; 30.11.2011

Очевидно, вы используете довольно слабый компилятор. Вот что делает из этого король стандартов Комо:

Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing.  All rights reserved.
MODE:strict errors C99 

"ComeauTest.c", line 2: error: standard requires that parameter "Mr32" be given a
          type by a subsequent declaration ("int" assumed)
  int main(Mr32) 
           ^

1 error detected in the compilation of "ComeauTest.c".
In strict mode, with -tused, Compile failed
Hit the Back Button to review your code and compile options. 
Compiled with C++0x extensions enabled.

Трудно сказать, что делает ваш компилятор, поскольку вы не сказали, что такое ваш компилятор.


Вы говорите, что хотите придерживаться C89. В этом случае предполагается, что параметр без информации о типе имеет тип int. Ваша функция main интерпретируется следующим образом:

int main(int Mr32)

Конечно, это по-прежнему недопустимо для C. Допустимыми функциями main в C являются:

int main(void)
int main(int argc, char* argv[])
person David Heffernan    schedule 27.09.2011
comment
вы имеете в виду, что это ошибка моего компилятора? и то, что я делаю, не разрешено стандартом языка c? - person Jeegar Patel; 27.09.2011
comment
Какой стандарт C вы кодируете? - person David Heffernan; 27.09.2011
comment
Вероятно, Mr32 является именем параметра int. Это то, что делает GCC, и, насколько мне известно, это обратная совместимость K&R. - person Steve Jessop; 27.09.2011
comment
Тем не менее, Comeau выдает предупреждение только в том случае, если вы отметите c99 и Compile в расслабленном режиме, и никаких предупреждений, если вы выберете c89/c90. - person nos; 27.09.2011

Поскольку это похоже на код для размещенной программы, код не является допустимым C, если только конкретный компилятор не задокументировал поведение «Mr32».

Наличие функции main(), которая принимает параметры, отличные от (void) или (int argc, char *argv[]), определяется реализацией (C99 5.1.2.2.1). Поэтому, если нет никакой документации о том, что должен делать "Mr32", компилятор не следует стандарту. Или, точнее, должна быть документация о том, что должен делать синтаксис int main(int) в этом компиляторе.

Это верно независимо от параметров функции стиля K&R. Я считаю, что стандарт одинаков для C89, C99, а также для всех стандартов C++.

Согласно сноске 9) в стандарте допустимо иметь другое целое, не названное argc, или typedef, эквивалентный int. Но в этом случае также должен быть второй параметр типа char**, чего здесь нет.

person Lundin    schedule 30.11.2011