编译Cordic开源项目时遇到语法错误求助
编译Cordic开源项目时遇到语法错误求助
看起来你在编译这个Cordic项目时踩了命名冲突的坑,我来帮你分析下问题根源和解决办法~
先把你遇到的错误信息整理出来方便排查:
执行的编译命令:
g++ -std=c++17 -o test_basic test_basic.cpp报错内容:
In file included from /usr/include/c++/11/cmath:45, from Cordic.h:24, from freal.h:43, from test_basic.cpp:23: Cordic.h:152:10: error: expected ‘)’ before ‘==’ token 152 | bool issubnormal( const T& x ) const; // fpclassify() is FP_SUBNORMAL | ^~~~~~~~~~~ Cordic.h:2319:28: error: expected unqualified-id before ‘(’ token 2319 | inline bool Cordic<T,FLT>::issubnormal( const T& x ) const | ^~~~~~~~~~~
问题根源
这个错误的核心是命名冲突:C++11及以后的标准库中,<cmath>头文件已经提供了std::issubnormal函数,而项目里的Cordic类又定义了同名的成员函数issubnormal。当编译器先包含<cmath>(这里是被Cordic.h间接包含的),就会把issubnormal识别为标准库的函数符号,导致类内的函数声明和定义出现语法解析错误。
可行的解决思路
- 方案一:修改项目内的函数名(最直接)
打开Cordic.h文件,把第152行的函数声明bool issubnormal( const T& x ) const;,以及第2319行对应的函数定义inline bool Cordic<T,FLT>::issubnormal( const T& x ) const,改成不冲突的名字,比如is_subnormal。修改后重新编译应该就能解决问题。 - 方案二:用命名空间隔离
如果项目本身没有使用命名空间,可以给整个Cordic类加上自定义命名空间,比如:
之后在使用namespace cordic { // 原来的Cordic类代码 template<typename T, int FLT> class Cordic { // ... 类内成员 ... bool issubnormal( const T& x ) const; // ... 其他成员 ... }; }Cordic类的地方(比如test_basic.cpp)加上cordic::前缀,或者用using namespace cordic;。不过这个改动涉及范围较大,需要全局调整代码。 - 方案三:尝试调整头文件包含顺序(不太推荐)
可以尝试把Cordic.h的包含语句放在<cmath>之前,但因为标准库头文件可能被其他文件间接包含,这个方法的稳定性不高,只能作为临时尝试。
备注:内容来源于stack exchange,提问作者RookieRyan
相关产品推荐
相关产品推荐

