在C ++中滥用#define表示法

时间:2017-08-28 23:15:47

标签: c++

我最近有点担心在c ++中滥用#define表示法,特别是竞争/数学编程。

我已经做了3个月的c ++(所以我是初学者)。几乎从我开始以来,我就使用了方便的

#define FOR(i,n) for(long (i)=0;(i)<(n);((i)++))

我必须说它让生活更轻松。

但最近我一直在使用

#define whole(x) begin(x),end(x)

执行accumulate(whole(iVector),0)之类的操作。我觉得没关系。

但现在我做的事情(对于骑士广度优先搜索问题)。

#define QUICKINSERT(a,b) if(iSet.find(current+make_pair(a,b))==iSet.end()){ iQue2.push(current + make_pair(a,b)); iSet.insert(current + make_pair(a,b)); }

                QUICKINSERT(x,y);  
                QUICKINSERT(y,x);  
                QUICKINSERT(-x,y);  
                QUICKINSERT(-y,x);  
                QUICKINSERT(x,-y);  
                QUICKINSERT(y,-x);  
                QUICKINSERT(-x,-y);  
                QUICKINSERT(-y,-x);  

如果它被带走会有什么后果?什么是alernatives(lambda函数或什么)?

1 个答案:

答案 0 :(得分:4)

这些宏看起来应该是函数。 评论中有很多论点,我将再添加一个: 你的宏与变量的命名紧密相关。

谁是iQue2?什么是iSet? 如果我想添加iSet2iQue并对其执行相同操作该怎么办?

template<typename T>
T accumulate_all(const std::vector<T>& v) {
  return std::accumulate(std::begin(v), std::end(v), 0);
}

template<typename T>
bool queue_if_not_in(std::set<T>& s, std::queue<T>& q, T& val) {
  if (s.find(val) == s.end()) {
    q.push(val);
    s.insert(val);
    return true;
  }
  return false;
}

您还可以查看here以查看宏可能导致什么,并且编译器在这种情况下无法提供帮助