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

问题描述 投票:0回答:3

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

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

c gcc error-handling program-entry-point
3个回答
8
投票

在 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
投票

显然你使用的是一个相当宽松的编译器。标准之王科莫是这样定义的:

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[])

0
投票

由于这似乎是托管程序的代码,因此该代码不是有效的 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 的 int,或者与 int 等效的 typedef。但在这种情况下,还必须有第二个 char** 类型的参数,但这里不是这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.