我正在从这个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; “它”未在此范围内声明。请帮忙!谢谢!
答案 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;
}