我只是想了解这个C代码(不是试图通过程序实现任何功能目标)。这使用gcc编译。 这是主要的 main(int a,char * argv []) 格式?是否允许在参数和函数体之间声明任何内容(类似于char * a; here)?
#include <stdio.h>
main(u,_,a)
char
*a;
{
//printf("%s\n",_,a);//just to help debugging
//printf("%d\n",u); //just to help debugging
}
答案 0 :(得分:4)
参数列表和函数体之间的声明是所谓的K&amp; R C(C的第一个版本)的一部分。如果您的编译器可以编译K&amp; R代码,那么它们是有效的。
关于main()
有两个以上的参数......是的,实际上,main最多可以有三个参数:
int main (int argc, char *argv[], char *envp[]);
第三个参数是一个指向字符串的指针数组,其中每个都包含一个环境变量定义(name=value
形式的字符串)
答案 1 :(得分:4)
这是编写C函数的旧的,过时的方式。
在C的祖先语言中,没有类型:所有变量都包含机器字。所以函数定义会这样开始:
main(u, _, a) {
/* ... some code ... */
}
来自C as it used to be(Brian Kernighan和Dennis Ritchie)的作者称为“K&amp; RC”的seminal book about C在一个看起来像变量声明的形式中添加了类型,并且位于列表之间函数参数和函数代码。
int main(u, _, a)
int u;
int _;
char *a;
{
/* ... some code ... */
}
在K&amp; R C中,如果类型是int
,那么在许多地方可以省略它。对于函数参数,您可以完全省略类型声明行。
int main(u, _, a)
char *a;
{
/* ... some code ... */
}
ANSI C于1989年被标准化,其主要创新之一是功能原型。在适当的ANSI C中,您在使用之前声明所有函数,并声明所有参数的类型。
int main(int u, int _, char *a)
{
/* ... some code ... */
}
C编译器仍支持遗留代码的旧表单。 (如果它们符合1989 C标准,则必须这样做。)20多年后遗留的遗留代码不多,所以你不会经常找到这样的代码。
(请注意,这不是main
的正确类型。我认为Gcc会警告您,但您可能需要更改警告设置。)
答案 2 :(得分:3)
这是一个旧的声明,除了混淆之外,没有人再使用它(参见:trigraphs!)。我认为在新的C标准下它是非法的,但是gcc仍然支持它以实现向后兼容。
它的工作方式是函数下列出的类型,并且不返回返回类型。没有返回类型意味着默认为int
。典型的主要功能可以这样写:
main(argc, argv)
int argc;
char** argv;
{
printf("%d\n", argc);
return 0;
}
您不能在左大括号之前声明其他变量。尝试添加int c;
并收到此错误:
test.c:4: error: declaration for parameter ‘c’ but no such parameter
答案 3 :(得分:-1)
这是main
声明的无效形式。这在C99 / C11中无效,但在C90中无效。
(有关C90中main
函数的有效声明,请参见5.1.2.2.1)。