4

我只是想理解这段 C 代码(而不是试图通过程序实现任何功能目标)。这使用 gcc 编译。这是 main(int a, char *argv[] ) 格式的 main 吗?是否允许在参数和函数体之间声明任何内容(类似于 char *a; 这里)?

#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

4 回答 4

4

参数列表和函数体之间的声明是所谓的 K&R C(C 的第一个版本)的一部分。所以是的,如果您的编译器可以编译 K&R 代码,它们是有效的。

关于main()有两个以上的参数......是的,事实上, main 最多可以有三个参数:

int main (int argc, char *argv[], char *envp[]);

第三个参数是一个指向字符串的指针数组,每个字符串都包含一个环境变量定义(格式为 的字符串name=value

于 2013-12-19T23:53:50.623 回答
4

这是编写 C 函数的一种陈旧过时的方法。

在 C 的祖先语言中,没有类型:所有变量都包含一个机器字。所以一个函数定义会像这样开始:

main(u, _, a) {
    /* ... some code ... */
}

过去的 C被称为“K&R C”,被关于 C 的开创性书籍的作者(Brian Kernighan 和 Dennis Ritchie)以一种看起来像变量声明的形式添加了类型,并且位于函数参数列表和函数的代码。

int main(u, _, a)
    int u;
    int _;
    char *a;
{
    /* ... some code ... */
}

在 K&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 会对此发出警告,但您可能必须将警告设置调高。)

于 2013-12-19T23:58:25.590 回答
3

这是一个古老的声明,除了混淆之外没有人再使用(另请参见:trigraphs!)。我认为在新的 C 标准下它是非法的,但 gcc 仍然支持它以实现向后兼容性。

它的工作方式是在函数下列出类型,并保留返回类型。没有返回类型意味着它默认为int. 典型的 main 函数可以这样写:

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
于 2013-12-19T23:53:49.377 回答
-1

这是一种无效的main声明形式。这在 C99 / C11 中无效,但在 C90 中也无效。(参见 5.1.2.2.1 了解mainC90 中的有效函数声明)。

于 2013-12-19T23:50:13.030 回答