关于redeclaration of C++ built-in type ‘char16_t’编译错误处理

问题描述:

最近在项目开发中遇到了编译器报redeclaration of C++ built-in type ‘char16_t’的编译错误,最后觉得解决方法比较有意思,所以分享和记录一下。


原因分析:

一般来说出现这个错误的原因在于使用typedef定义了标准库中已经存在的变量类型当作别名:
例如:

typedef int INT; //这是正常的用法,定义了int的一个别名INT
int i = 0;
INT j = 0;
//以上两种效果是一致的,都定义了一个int类型的变量

typedef int char; //这样使用的话,则会报标题的这种错误
//原因在于char是一种内置的变量类型,不能被定义做其他变量类型的别名

按照上面第二种写法的话,编译器则会报redeclaration of C++ built-in type ‘char’这样的错误。如果是自己写出来的bug,改起来也比较简单,直接拿掉或者换个名字就可以。

但是大部分情况下都没有那么简单,例如我这次遇到这个问题的原因就在于在Makefile中增加了对C++ 11的支持,导致的报错。
并且报错的地方是安卓中的源码:
可以看到Android 4.0的源码中Unicode.h头文件

/*
 * Copyright (C) 2005 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_UNICODE_H
#define ANDROID_UNICODE_H

#include <sys/types.h>
#include <stdint.h>

extern "C" {

typedef uint32_t char32_t;
typedef uint16_t char16_t;

从源码中可以看到 typedef uint16_t char16_t 这样的定义,而对于C++ 11来说char16_t就是它内置的变量类型。
所以,最终看到问题出现的地方在于Android的源码中,因为许多模组都在使用这些头文件,所以并不好升级源码,可能会引起其他模组的异常。


解决方案:

从网上找了许多方法,有的说把C++ 11拿掉,这个方法第一时间就被排除掉了,我正是需要使用到C++ 11才加上来的,不可能拿掉。
还有人说,修改源码,把typedef uint16_t char16_t ==> typedef uint16_t CHAR16_T; 这个同样不可行,如果其他模块使用到了char16_t这种类型,这样则会导致其他模块编译报错。

通过一番功夫,最终在stackoverflow找到了对应的解决方法(stackoverflow还是强),解决方法就是在自己模组include头文件之前通过宏的方式把char16_t定义一个其他的名字,在之后将其undef掉。可能这样说不清楚,看下面的代码就懂了。

#define char16_t LIBRARY_char16_t
#include <Unicode.h>
#undef char16_t
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值