我遇到过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;
}
谢谢
更新
通过gcc -E
查看预处理器输出后,看起来在指定完整路径时,gcc不会将其视为系统包含路径,并且不知何故,它会导致(导致?)错误。尝试使用-isystem
和/usr/include
的{{1}}选项,但无济于事。
答案 0 :(得分:1)
在Glibc的<sys/types.h>
中,int8_t
等的typedef受到
#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
。