这里我在主参数声明中写了我的名字,但是这个程序仍然工作并且没有给出任何警告。
#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()对吗?? ?
ok -Wextra显示mr32默认为int的警告。
那么为什么main()中任何参数的默认类型都是int?
在K& C定义中,不带type的参数默认为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()
注意
虽然这是支持的,但我永远不会使用它:代码应该是可读的
显然您使用的是相当宽松的编译器。这是科莫国王对它的标准:
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
函数:
int main(void)
int main(int argc, char* argv[])
由于这似乎是宿主程序的代码,因此该代码不是有效的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的类型定义。但在这种情况下,还必须有第二个char**类型的形参,这里不是这样的