typedef float _Float32 的声明说明符中有两个或多个数据类型;
Posted
技术标签:
【中文标题】typedef float _Float32 的声明说明符中有两个或多个数据类型;【英文标题】:two or more data types in declaration specifiers for typedef float _Float32; 【发布时间】:2019-02-23 17:04:04 【问题描述】:我正在将一个相当旧的 C(和一点 C++)代码基础从 KEIL OS 移植到 Linux 32 位。
当使用 gcc/g++ 6.3 到 6.5 编译时,它可以正常工作,当尝试使用 gcc > 7.0(在 ubuntu 18.04 上使用 7.3 和 8.2 测试)时,我得到编译错误:
/usr/include/bits/floatn-common.h:207:15: error: two or more data types in declaration specifiers
typedef float _Float32;
^~~~~~~~
/usr/include/bits/floatn-common.h:244:16: error: two or more data types in declaration specifiers
typedef double _Float64;
^~~~~~~~
/usr/include/bits/floatn-common.h:261:16: error: two or more data types in declaration specifiers
typedef double _Float32x;
^~~~~~~~~
/usr/include/bits/floatn-common.h:278:21: error: two or more data types in declaration specifiers
typedef long double _Float64x;
编译器头(/usr/include/bits/floatn-common.h:261:16
)文件包含以下部分:
# if __HAVE_FLOAT32
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef float _Float32;
# endif
# if !__GNUC_PREREQ (7, 0)
# define __builtin_huge_valf32() (__builtin_huge_valf ())
# define __builtin_inff32() (__builtin_inff ())
# define __builtin_nanf32(x) (__builtin_nanf (x))
# define __builtin_nansf32(x) (__builtin_nansf (x))
# endif
# endif
这告诉我这只与gcc > 7.0
有关
与此错误相关的大多数问题都缺少“;”在结构中或做类似的事情
void int myFunction(void)
虽然我认为这里不是这种情况,因为它出现在不同的编译单元中,并且适用于 gcc/g++
的早期版本
using glibc version 2.2
7
我的问题:有没有办法禁用这个新的编译器功能,或者最终来自社区的提示从哪里开始搜索
【问题讨论】:
“相当旧的代码”似乎以某种不再有效的非标准方式包含非公共标头。问题不在于标题,而在于需要修复的代码。您需要查看正在编译的代码,摆脱对非公共头文件的引用,并找出它需要包含哪些头文件而不是它们。 请发minimal reproducible example。is there a way to disable this new compiler feature
- 这不是真正的编译器未来。 two or more data types in declaration specifiers
- 代码中的_Float32
是您程序中定义的宏吗?追踪它,删除它。 _Float32
应该由编译器定义。在我看来,你的代码是 #define _Float32 float
然后是 typedef float float;
....
@KamilCuk 我已经找到了那些宏,代码中没有...
你需要追踪它。这个are missing ";" in structs
我不明白,你能发布一些你遇到的错误吗?然后找出 _Float32 是在哪里定义的?你能创建出现问题的最小的 .c 文件/事务单元吗?您需要找到问题的最小可重现示例。
【参考方案1】:
发现问题:
在源代码的某个地方有一个
#undef __GNUC__
这是由损坏的代码生成工具生成的...
通过这样做,math.h 或 wchar.h 的所有包含都被破坏了...
【讨论】:
以上是关于typedef float _Float32 的声明说明符中有两个或多个数据类型;的主要内容,如果未能解决你的问题,请参考以下文章
将 numpy 数组类型和值从 Float64 转换为 Float32
TypeError:预期的 float32,得到的列表包含类型为“_Message”的张量
让 RESNet18 与 float32 数据一起工作 [重复]
如何在 ARM NEON 中将 uint8x8_t 加载到 float32x4 中?