1

理解しようとしている GCC インクルードの動作に遭遇しました。私が提供している例は、最も単純なテスト コードです。実際のコード (およびこの動作) は、コードを計測するために使用しているツールの結果です。このツールを使用する必要があります。エラーが発生する理由を理解しようとしています。興味深いことに、g++ は問題なく動作します。次に例を示します。

すべてを含める<sys/types.h>と問題なくコンパイルされますが、含める"/usr/include/sys/types.h"とエラーが発生します。

gccフルパスを含む以下の最初のコマンドを実行すると、次のエラーが表示されます。

In file included from hello.c:7:
/usr/include/sys/types.h:195: error: redefinition of typedef ‘int8_t’
hello.c:5: error: previous declaration of ‘int8_t’ was here

GCC 4.1.2 (CentOS 5) を使用するコンパイラ コマンドにより、次のエラーが発生します。

gcc -g -I. --verbose -c -o hello.o -DLONG_INCLUDE hello.c

またはエラーを引き起こさないこれ

gcc -g -I. --verbose -c -o hello.o hello.c

コード:

/* hello2.h */

#ifdef _cplusplus
extern "C" {
#endif

int myFunc(int *a);

#ifdef _cplusplus
}
#endif



/* hello.c */
#include <stdio.h>
#include <string.h>
typedef signed char int8_t;
#ifdef LONG_INCLUDE
#include "/usr/include/sys/types.h"
#else
#include <sys/types.h>
#endif
#include "hello.h"


int myFunc(int *a)
{

  if (a == NULL)
    return -1;

  int b = *a;

  b += 20;

  if (b > 80)
    b = 80;

  return b;
}

ありがとうございました

アップデート:

After looking at preprocessor output via gcc -E it looks like when specifying the full path, gcc does not treat it as a system include path and that, somehow, is contributing (causing?) the error. Tries to use the -isystem option for /usr/include and /usr/include/sys but to no avail.

4

1 に答える 1

1

Glibc<sys/types.h>では、etcなどのtypedefint8_tはによって保護されています

#if !__GNUC_PREREQ (2, 7)

/* These types are defined by the ISO C99 header <inttypes.h>. */
# ifndef __int8_t_defined
#  define __int8_t_defined
typedef char int8_t;
typedef short int int16_t;
typedef int int32_t;
#  if __WORDSIZE == 64
typedef long int int64_t;
#  elif __GLIBC_HAVE_LONG_LONG
__extension__ typedef long long int int64_t;
#  endif
# endif

したがって、この問題の回避策は、コマンドラインで保護マクロを定義し、-D__int8_t_definedに加えて渡すこと-DLONG_INCLUDEです。

于 2012-06-12T21:08:58.830 に答える