这段代码(容器遍历的宏)是否有效?如果有,为什么?

Ale*_*tto 1 c++ macros containers

在关于TopCoder的Dmitry Korolev教程之后,我遇到了这个泛型容器遍历宏:

#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++) 
Run Code Online (Sandbox Code Playgroud)

它让我困惑,因为它似乎缺少一个括号.在解释中,他说typeof(...)被表达式(...)的类型所取代,这让我对这个遍历宏更加困惑(因为我的直觉看到typeof(x; y; z)和因为x; y; z不是表达式,即使它工作了typeof(...)也会"吃掉"(...)).

它有用吗?为什么?

Pra*_*rav 7

#define tr(container, it) \ 
 for(typeof(container.begin()) it = container.begin(); \ 
                               it != container.end(); \
                                it++
    )
Run Code Online (Sandbox Code Playgroud)

这是他写的语法正确的.BTW typeof是gcc扩展,不适用于其他编译器.

如果您的编译器支持C++ 0x,您可能想要使用 auto

例如,相同的宏可以用C++ 0x编写

#define tr(container, it) \ 
 for(auto it = container.begin(); \ 
          it != container.end(); \
          it++
    )
Run Code Online (Sandbox Code Playgroud)