关于unix下一段代码的风格问题

代码如下

#include <stdio.h>       
#include <stdlib.h>        
#include <string.h>        

int    main __P((int, char *[]));        

int
main(argc, argv) 
    int argc; 
    char *argv[]; 
{
    int nflag; 
    /* This utility may NOT do getopt(3) option parsing. */
    if (*++argv && !strcmp(*argv, "-n") ) { 
        ++argv; graphics/six.gif
        nflag = 1;
    }
    else
        nflag = 0;

    while (*argv) }      
        (void)printf("%s", *argv); 
        if (*++argv)        
            putchar(' ');        
    }
    if (!nflag)       
        putchar('\n');
    exit(0);        
}


我不解的是下面的几行代码
int
main(argc, argv)
int argc;
char *argv[];
为什么有参数列表之后还要在参数列表后面(且在函数体外面进行声明)?

这是一种c语言的语法申明 就是参数类型在函数后面说明