【问题标题】:Am I not using typeof() correctly here?我在这里没有正确使用 typeof() 吗?
【发布时间】:2012-02-05 09:31:18
【问题描述】:

我的代码是这样的

#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++)

...

typedef vector<long> vl;
vl numbers;

...

tr(numbers, j) { // this is line 95
    ...
}

代码对我来说看起来不错,但对我的编译器来说却不是!无情地,我得到以下错误:

code.cpp:在函数'int main()'中:

code.cpp:95:9: 错误:实例化后“std::vector::iterator”的特化

code.cpp:95:9: 错误:'typeof' 之前的预期主表达式

code.cpp:95:9: 错误:在“typeof”之前需要“;”

code.cpp:95:9: 错误:“j”的名称查找已更改为 ISO“for”范围

code.cpp:95:9: 注意:(如果你使用'-fpermissive' G++ 将接受你的 代码)

code.cpp:95:9: 错误:'j!= 中的'operator!=' 不匹配 numbers.std::vector<_tp _alloc>::end with _Tp = long int, _Alloc = std::allocator, std::vector<_tp _alloc>::iterator = __gnu_cxx::__normal_iterator >,类型名 std::_Vector_base<_tp _alloc>::_Tp_alloc_type::pointer = 长整数*'

我在这里错过了什么?

【问题讨论】:

  • @DeadMG,我理解对宏的普遍看法。但在这种情况下,实际问题是什么?除了与c 被多次评估这一事实相关的风险之外。以及typeof的不可移植性。
  • 什么是 typeof 关键字??第一次见。。
  • 如果您能够使用 C++11,请查看 autodecltype 而不是(显然)编译器扩展。
  • @codekiddy:这是获取表达式类型的 GCC 扩展。它与 C++11 中的 decltype 几乎相同,尽管我怀疑会有一些细微的差别。

标签: c++ stl g++


【解决方案1】:

宏中缺少括号。

#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++)
                                      ^
                                 Need ) here

尝试修复它,看看你得到了什么错误。

小提示 1:迭代时,使用 ++i 而不是 i++,因为前者对于迭代器来说通常更快。

小注 2:typeof 是 GCC 特定的扩展。您的代码不会在其他编译器上编译。

【讨论】:

  • 是的。缺少括号和大括号通常会导致非常混乱的错误,因为它们会导致编译器以与您预期完全不同的方式解析您的代码。恐怕我们必须忍受的东西:-)
  • @PeterAlexander:或者只使用更简单的代码:for (n : numbers) { /*...*/ }
  • 您可以在 C++11 中使用 autodecltype((c).begin())
  • @KerrekSB:在 C++11 功能普及之前,我不会推荐它们。
【解决方案2】:

我认为你缺少一个 ')'

#define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多