首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >isfinite可以在Linux、BSD和Windows上编译,但不能在SmartOS上编译

isfinite可以在Linux、BSD和Windows上编译,但不能在SmartOS上编译
EN

Stack Overflow用户
提问于 2021-01-17 17:48:53
回答 1查看 25关注 0票数 0

我正在尝试将Quadlods移植到SmartOS。它在Linux和DragonFly BSD上编译和运行。我没有尝试过在Windows上运行它,但是其他使用xy类和isfinite方法的程序在Windows上编译和运行。然而,在SmartOS上编译它时,我得到了这个错误:

代码语言:javascript
复制
[ 15%] Building CXX object CMakeFiles/quadlods.dir/filltest.cpp.o
In file included from /usr/include/math.h:36,
                 from /opt/local/gcc9/include/c++/9.3.0/bits/std_abs.h:40,
                 from /opt/local/gcc9/include/c++/9.3.0/cstdlib:77,
                 from /opt/local/gcc9/include/c++/9.3.0/ext/string_conversions.h:41,
                 from /opt/local/gcc9/include/c++/9.3.0/bits/basic_string.h:6493,
                 from /opt/local/gcc9/include/c++/9.3.0/string:55,
                 from /opt/local/gcc9/include/c++/9.3.0/stdexcept:39,
                 from /opt/local/gcc9/include/c++/9.3.0/optional:38,
                 from /opt/local/gcc9/include/c++/9.3.0/bits/node_handle.h:39,
                 from /opt/local/gcc9/include/c++/9.3.0/bits/stl_tree.h:72,
                 from /opt/local/gcc9/include/c++/9.3.0/map:60,
                 from /home/phma/src/quadlods/quadlods.h:27,
                 from /home/phma/src/quadlods/filltest.h:25,
                 from /home/phma/src/quadlods/filltest.cpp:26:
/home/phma/src/quadlods/xy.h:35:8: error: expected ')' before '!=' token
   35 |   bool isfinite() const;
      |        ^~~~~~~~

定义宏的文件是/usr/include/iso/math_c99.h,它会导致这个奇怪的错误:

代码语言:javascript
复制
#define isfinite(x) (__builtin_isfinite(x) != 0)

头文件中的类定义是

代码语言:javascript
复制
class xy
{
public:
  xy(double e,double n);
  xy();
  double getx() const;
  double gety() const;
  double length() const;
  bool isfinite() const;
  bool isnan() const;
  friend xy operator+(const xy &l,const xy &r);
  friend xy operator+=(xy &l,const xy &r);
  friend xy operator-=(xy &l,const xy &r);
  friend xy operator-(const xy &l,const xy &r);
  friend xy operator-(const xy &r);
  friend xy operator*(const xy &l,double r);
  friend xy operator*(double l,const xy &r);
  friend xy operator/(const xy &l,double r);
  friend xy operator/=(xy &l,double r);
  friend bool operator!=(const xy &l,const xy &r);
  friend bool operator==(const xy &l,const xy &r);
  friend xy turn90(xy a);
  friend xy turn(xy a,int angle);
  friend double dist(xy a,xy b);
protected:
  double x,y;
};

有没有可能在不重命名该方法的情况下在SmartOS上进行编译?我想取消定义isfined宏,但是在另一个程序中(不是Quadlods,它的头文件只有Quadlos.h),xy类在库的头文件中。此外,isfinite方法调用std::isfinite。

EN

回答 1

Stack Overflow用户

发布于 2021-01-18 21:52:25

Jonathan Perkin在IRC上给我的解决方案是将#include <cmath>放在xy.h的include guard之后。这取消了宏的定义。它现在可以在Linux、BSD和SmartOS上编译。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65759194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档