почему "int main (any_you_type)" не выдает никакой ошибки? - PullRequest
9 голосов
/ 27 сентября 2011

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

#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 () right .. ??

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

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

Ответы [ 3 ]

8 голосов
/ 27 сентября 2011

В определении 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()
    

Примечание

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

3 голосов
/ 27 сентября 2011

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

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[])
0 голосов
/ 30 ноября 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) к стандарту допустимо иметь другое значение типа int без имени argc или typedef, эквивалентное значению типа int. Но в этом случае должен быть и второй параметр типа char **, что здесь не так.

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