LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1023|回复: 4

C语言问题

[复制链接]
发表于 2007-2-12 21:30:31 | 显示全部楼层 |阅读模式
下面不知道是哪个版本的NetBSD的echo的源码,谁能告诉我 int main __P((int, char *[]))这是种什么样的写法。

[PHP]#include <sys/cdefs.h>
#ifndef lint
__COPYRIGHT(
"@(#) Copyright (c) 1989, 1993\n\
        The Regents of the University of California.  All rights reserved.\n");
#endif /* not lint */

#ifndef lint
#if 0
static char sccsid[] = "@(#)echo.c        8.1 (Berkeley) 5/31/93";
#else
__RCSID("$NetBSD: echo.c,v 1.7 1997/07/20 06:07:03 thorpej Exp $");
#endif
#endif /* not lint */

#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;
                nflag = 1;
        }
        else
                nflag = 0;

        while (*argv) {
                (void)printf("%s", *argv);
                if (*++argv)
                        putchar(' ');
        }
        if (!nflag)
                putchar('\n');
        exit(0);
}[/PHP]
发表于 2007-2-13 10:30:12 | 显示全部楼层
可能是个类型定义的宏吧。。。我乱猜的。
回复 支持 反对

使用道具 举报

发表于 2007-2-14 12:56:34 | 显示全部楼层
  1. #ifndef __P
  2. #ifdef __STDC__
  3. #define __P(p)  p
  4. #else
  5. #define __P(p)  ()
  6. #endif
  7. #endif  /* !defined(__P) */
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-14 21:55:54 | 显示全部楼层
Post by manphiz

  1. #ifndef __P
  2. #ifdef __STDC__
  3. #define __P(p)  p
  4. #else
  5. #define __P(p)  ()
  6. #endif
  7. #endif  /* !defined(__P) */
复制代码


这种宏定义是干什么用的,可以解释一下么?
回复 支持 反对

使用道具 举报

发表于 2007-2-15 21:26:53 | 显示全部楼层
这种__P()完全是兼容以前的声明语法,看__P的定义:
#define __P(p) p
就可以知道,预处理后是不会改变宏中的表达式的。(这是标准C STDC)
但是有时为了兼容老的编译器,会把__P()定义为:
#define __P(p) ()
使声明函数时就有一个函数名加返回类型。
当然这是为了兼容以前的。现在写代码可以不用这个宏了。
BTW:以后关于预处理的一些问题都可以用gcc -E以后的文件对照原来的文件看看,一般可以解决问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表