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.27

我的问题:有没有办法禁用这个新的编译器功能,或者最终来自社区的提示从哪里开始搜索

【问题讨论】:

“相当旧的代码”似乎以某种不再有效的非标准方式包含非公共标头。问题不在于标题,而在于需要修复的代码。您需要查看正在编译的代码,摆脱对非公共头文件的引用,并找出它需要包含哪些头文件而不是它们。 请发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 中?

arm_neon.h 是不是缺少所有 float16_t 类型?

比较 uint64_t 和 float 的数值等价性