为什么程序编译?

时间:2013-12-19 23:46:29

标签: c function kr-c

我只是想了解这个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
}

4 个答案:

答案 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)。