uint8_t 和 unsigned char 链接错误

Posted

技术标签:

【中文标题】uint8_t 和 unsigned char 链接错误【英文标题】:uint8_t and unsigned char linking error 【发布时间】:2011-06-02 06:00:45 【问题描述】:

我正在使用模板函数:

template<typename T> void func(const T& value)

    obj->func(value);

其中 obj 是类的对象:

void my_object::func(int64_t value)  ... 
void my_object::func(uint64_t value)  ... 
void my_object::func(uint32_t value)  ... 
void my_object::func(uint16_t value)  ... 
void my_object::func(uint8_t value)  ... 

问题在于 my_object::func() 覆盖的 uint8_t 重载。链接器抱怨重载的未解析外部符号,应该unsigned char 参数。

我应该将 uint8_t 重载替换为 unsigned char 重载吗?

编辑:刚才注意到,链接器也抱怨 uint64_tint64_t

我在 Windows 上使用 MSVC++ 2008 Express 进行编译。

编辑:抱歉,我声明 my_object::func(uint8_t value) 函数(和其他),但我没有定义它。

【问题讨论】:

顺便问一下,你的编译器是什么? 您收到的确切错误消息是什么? 您应该尝试缩小问题范围,并提供更多关于您实际在做什么的细节。真的是因为模板 - 如果您直接调用 obj::func() 会发生什么?你如何定义你的类,以及你在哪里以及如何实现它的?仅凭您提供的描述,人们就不得不猜测实际发生了什么。 确保使用相同的标头和这些整数类型的 typedef。 MSVC 在解析等价类型方面存在缺陷。在某些情况下,两种类型的 C++ 相同,但 MSVC 对它们有不同的内部类型。这些内部类型使其进入链接器,因此不匹配。 【参考方案1】:

尝试用

编译
template void my_object::func(int64_t value)  ... 
template void my_object::func(uint64_t value)  ... 
template void my_object::func(uint32_t value)  ... 
template void my_object::func(uint16_t value)  ... 
template void my_object::func(uint8_t value)  ... 

用类似的问题解决了我的问题

【讨论】:

【参考方案2】:

这是include 文件应该#include 以使用上述类型(C99 建议)

#include

【讨论】:

它会导致 link 错误,因为在通过 typedef 声明所有 int32... ,在编译期间,所有上述特殊类型都不再存在 - 因此它们在 linking 期间也不存在。 stdint.h 被包含在 C99 中以帮助程序可移植性。它也可以在 Windows 上使用。见en.wikipedia.org/wiki/Stdint.h 对于 C++ 程序来说真的应该是 #include 。 VS2008 中不包含该标头,但您可以在“网络”的多个地方找到兼容的文件。【参考方案3】:

我猜uint8_t 已经被typedef 编辑为unsigned char,这就是为什么你会看到它。

【讨论】:

看源码,没有。 uint8_t 是 UINT8 的 typedef。 hm.. 我不确定,但 uint8_t 属于 stdint.h,其目的是从原始类型中抽象出来,而原始类型又可能在不同平台上有所不同。 我正在使用的库包含包含文件,用于区分构建环境。如果是 windows,它会手动定义所有 int 类型,如果是 Linux,它包括 stdint.h 和 inttypes.h

以上是关于uint8_t 和 unsigned char 链接错误的主要内容,如果未能解决你的问题,请参考以下文章

uint8_t uint32_t 类型强制转换出错 以及 unsigned char 类型和 unsigned int 类型相互转化

错误:从“uint8_t* aka unsigned char*”转换为“unsigned int”会丢失精度 [-fpermissive]

将 unsigned char 数组转换为 uint8_t 数组?

React Native Build Error on IOS - typedef用不同类型重新定义('uint8_t'(又名'unsigned char')与'enum clockid_t')

react-native 无法构建 ios:(错误 xcode Flipper)Typedef 重新定义不同类型('uint8_t'(又名'unsigned char')与'enum clockid_

将 uint8_t* 更改为 char*?