这是简单的echo.c源代码:
#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[];
{
/*
*main code with no error at all
*/
}
使用gcc 4.4.6编译时,会报告错误:
echo.c:4: error: expected declaration specifiers or â...â before string constant
echo.c:3: warning: data definition has no type or storage class
echo.c:12: error: expected declaration specifiers or â...â before string constant
echo.c:12: warning: data definition has no type or storage class
第3行和第4行是__COPYRIGHT宏。 第12行是__RCSID宏。
如果删除这两个宏,它会成功编译并正确运行。
经过一些谷歌搜索,我知道这两个宏是在sys / cdefs.h中定义的,它们是某种评论信息。
但是为什么它不会在gcc中编译?
答案 0 :(得分:1)
在通过sys / cdefs.h(ubuntu 11.10)之后,我发现没有__COPYRIGHT
或__RCSID
定义。
所以我猜这两个宏是在NetBSD sys / cdefs.h中定义的。
我将它们添加到一个新的头文件中(我将其命名为“aeodefs.h”),如下所示:
#ifndef _AEODEFS_H_
#define _AEODEFS_H_
#include <sys/cdefs.h>
#define __IDSTRING(name,string) \
static const char name[] __attribute__((__unused__)) = string
#ifndef __RCSID
#define __RCSID(s) __IDSTRING(rcsid,s)
#endif
#ifndef __COPYRIGHT
#define __COPYRIGHT(s) __IDSTRING(copyright,s)
#endif
#endif /* !_AEODEFS_H_ */
然后将#include <sys/cdefs.h>
更改为#include "aeodefs.h"
。
已经完成了!