0

簡単な 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 マクロです。

これら 2 つのマクロを削除すると、正常にコンパイルされ、正しく実行されます。

グーグルで調べたところ、これらの 2 つのマクロは sys/cdefs.h で定義されており、何らかのコメント メッセージであることがわかりました。

しかし、なぜ gcc でコンパイルできないのでしょうか?

4

1 に答える 1

2

__COPYRIGHTsys / cdefs.h(ubuntu 11.10)を調べた後、定義が見つかりませんでし__RCSIDた。したがって、これら 2 つのマクロは 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"ます。

終わった!

于 2013-02-21T04:04:08.037 に答える