C ++和预处理器宏问题

时间:2010-04-30 01:25:40

标签: c++ c-preprocessor

你能弄清楚下面的陈述有什么问题吗?

GCC错误状态:

  

'type name'声明为函数返回数组

#define MACRO(a) (a)[1]

class index {
public:
    typedef int index_type[2];
    const index_type& operator[](int i) const;
};

int k = 0;
int i = MACRO(index()[k]);
顺便说一句:我知道出了什么问题,我认为这是有趣的事情。非常感谢litb,他对以前的问题的解释很快就帮助解决了这个错误。

3 个答案:

答案 0 :(得分:4)

在扩展的行中:

int i = (index()[k])[1];

(index()[k])被解释为强制转换表达式,声明一个返回索引长度为k的数组的函数。至少,这就是它看起来正在发生的事情。 gcc如何设法有效地将[1]解释为表达式,我不确定。

答案 1 :(得分:2)

我的猜测是你的语法有歧义。编译器可能正在查看扩展的宏:

 int i = (index()[k])[1];

并认为index实际上是一个返回数组的非成员函数声明,而不是构造 type index的临时对象。

但这只是猜测...如果你已经知道答案,请启发我们:)

答案 2 :(得分:1)

应用宏时,它会扩展为:

class index 
{
    // ...
    typedef int index_type[2];
    const index_type& operator[](int i)const;
    // ...
};

int k = 0;
int i = (index()[k])[1];

现在问题(假设index :: operator []是公共的,并且从你的代码片段中看不明显的是)index :: operator []的结果是通过引用返回的,而你正在构造index()对象作为临时对象,因此,假设你的index :: operator []被实现,我猜你已经实现了它(返回对成员对象的引用),index ::的结果返回后,operator []将立即失效(因为临时被破坏),因此你有不确定的行为。