由于"signed char"和"char",系统头文件中的重定义错误

redefinition error in system header file because of "signed char" and "char"

本文关键字:char 定义 文件 错误 系统 signed 由于      更新时间:2023-10-16

我试图包含这个文件

 boost/assign/list_of.hpp

但是我有这个编译器的错误

/usr/include/boost/type_traits/is_integral.hpp:38: error: redefinition of struct boost::is_integral<char>
/usr/include/boost/type_traits/is_integral.hpp:32: error: previous  definition of  struct boost::is_integral<char>

文件is_integral.hpp中的这些定义行(32,38)是:

BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed char,true)
BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,char,true)

如何解决编译问题?编译器是gcc版本4.4.7 20120313操作系统是Red Hat Enterprise Linux Server 6.5版(Santiago)

来自C++标准

3.9.1基本类型【basic.basic】

声明为字符(char)的对象应足够大,以存储实现的基本字符集的任何成员。如果该集合中的字符存储在字符对象中,则该字符对象的整数值等于该字符的单字符文字形式的值。实现定义了char对象是否可以包含负值。字符可以显式声明为无符号或有符号纯字符、有符号字符和无符号字符是三种不同的类型。一个字符、一个有符号字符和一个无符号字符占用相同的存储量,并且具有相同的对齐要求(basic.types);也就是说,它们具有相同的对象表示。对于字符类型,对象表示的所有位都参与到值表示中。对于无符号字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型。在任何特定的实现中,纯字符对象可以采用与有符号字符或无符号字符相同的值;哪一个是实现定义的。

因此charunsigned charsigned char是三种不同的类型,并且boost::is_integral应该专门用于这三种类型。人们可以期望gcc 4.4.7或OP的环境忽略这一点,我将寻求解释。请将此临时答复视为对OP问题的延伸评论。


编辑:无法再现

系统:Red Hat 6

$ uname -a
Linux ysc 2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 21:11:36 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux$

编译器:

$ g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)

来源

$ cat main.cpp
#include <iostream>
template<typename T>
struct trait
{
    static const int value = 0;
};
template<>
struct trait<char>
{
    static const int value = 1;
};
template<>
struct trait<signed char>
{
    static const int value = 2;
};
template<>
struct trait<unsigned char>
{
    static const int value = 3;
};
int main()
{
  std::cout << "int:, " << trait<int>::value << "!n";
  std::cout << "char:, " << trait<char>::value << "!n";
  std::cout << "unsigned char:, " << trait<unsigned char>::value << "!n";
  std::cout << "signed char:, " << trait<signed char>::value << "!n"; 
}

编译

$ g++ -Wall -Wextra main.cpp 

运行

$ ./a.out 
int:, 0!
char:, 1!
unsigned char:, 3!
signed char:, 2!

它对OP的环境产生了什么影响?

相关文章: