C复数类型typedef在IAR编译报错但GCC、ARMCC可正常编译问题
问题原因分析
- 核心原因是IAR V8.42.1版本对C99
_Complex关键字的实现和GCC、ARM编译器不同:_Complex并非C99模式下的全局内置关键字,它的识别依赖<complex.h>头文件的引入。
当你没有在定义typedef float _Complex f_complex;的文件中提前包含<complex.h>时,编译器会把_Complex识别为普通未声明标识符,此时编译器解析到typedef float _Complex会认为这是一个完整的float类型变量声明语句,后续的f_complex属于多余语法内容,因此抛出expected a ";"的报错。 - 为什么用
_Fcomplex可以正常编译?<complex.h>头文件内部有IAR编译器专属的预处理逻辑或扩展声明,会在头文件作用域内激活_Complex关键字的识别,因此头文件内的typedef float _Complex _Fcomplex;可以正常解析完成类型定义。你直接引用已经定义完成的_Fcomplex类型别名,自然不会触发语法报错。 - 兼容解决方案
在定义你的f_complex类型别名的文件开头,先引入<complex.h>头文件,即可正常使用typedef float _Complex f_complex;写法,和其他编译器的通用写法保持一致。
内容的提问来源于stack exchange,提问作者dandan78
相关产品推荐
相关产品推荐

