为什么“int main(anything_you_type)”不会产生任何错误?

时间:2011-09-27 09:01:10

标签: c gcc compiler-construction error-handling main

这里我在主参数声明中写了我的名字,但是这个程序仍然有效,并没有给出任何警告。

#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?

3 个答案:

答案 0 :(得分:8)

在K&amp; R C定义中,没有类型的参数默认为int。您的代码对应于

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

详细了解这个答案:C function syntax, parameter types declared after parameter list

<强>更新

总结一下:在C89中,仍然支持K&amp; R声明

  • 未声明的参数类型默认为int

    void foo( param )
    

    默认为

    void foo( int param )
    
  • 未指定的返回类型默认为int

    foo()
    

    默认为

    int foo()
    

注意

虽然这是支持我永远不会使用它:代码应该是可读的

答案 1 :(得分:3)

显然你使用的是一个相当宽松的编译器。这就是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. C中的有效main函数是:

int main(void)
int main(int argc, char* argv[])

答案 2 :(得分:0)

由于这似乎是托管程序的代码,因此代码无效C,除非特定编译器记录了“Mr32”的行为。

要使一个接受除(void)(int argc, char *argv[])之外的其他参数的main()函数是实现定义的行为(C99 5.1.2.2.1)。因此,如果没有关于“Mr32”应该做什么的任何文档,编译器就不遵循标准。或者更具体地说,需要记录int main(int)语法应该对此编译器执行的操作。

无论K&amp; R样式函数参数如何,都是如此。我相信C89,C99以及所有C ++标准的标准都是相同的。

根据标准中的脚注9),可以使用另一个名为argc的int或一个等同于int的typedef。但在这种情况下,必须有char **类型的第二个参数,这不是这里的情况。