C ++ - 使用typeof运算符给出错误的宏

时间:2016-12-21 09:40:10

标签: c++ macros

我正在从这个topcoder链接学习C ++(STL):https://www.topcoder.com/community/data-science/data-science-tutorials/power-up-c-with-the-standard-template-library-part-1/ 并且作者使用了宏,这是我第一次学习。 我试图以下列方式使用它,但我遇到了一些错误:

#include <iostream>
#include <vector>
#include <set>

//Macros

#define tr(container, it)\
    for(typeof(container.begin()) it = container.begin(); it!=container.end(); it++);

using namespace std;

int main()
{
    set< pair<string, pair< int, vector<int> > > >SS; 
    int total = 0; 
    tr(SS, it) { 
        total += it->second.first; 
    }
    return 0; 
}

错误:在使用宏的行上,我收到错误 - &gt; “它”未在此范围内声明。请帮忙!谢谢!

2 个答案:

答案 0 :(得分:5)

你的for循环后你有一个分号。删除它。

答案 1 :(得分:2)

预处理程序指令不是实际C ++语言的一部分,因此不遵循C ++的所有规则。这包括它们不会以分号结束。

当您使用它时,末尾的分号将包含在宏扩展中。这意味着扩展时for循环看起来像这样:

for(typeof(SS.begin()) it = SS.begin(); it!=SS.end(); it++);) { 
    total += it->second.first; 
}

循环体是由该分号创建的空语句,{}中包含的块不是循环的一部分。

您还应该尝试避免使用宏。在C ++中,对宏的需求已大大减少。在这种情况下,确实不需要宏。实际上也不是一个函数(这是替换宏的常用方法)。

事实上,如果你有一个相对现代和最新的编译器,那么你可以使用range-based for loop

for (auto const& p : SS) {
    total += p.second.first;
}