调用临时对象的方法会导致旧 c 库的编译器错误

Posted

技术标签:

【中文标题】调用临时对象的方法会导致旧 c 库的编译器错误【英文标题】:Calling temporary object’s methods gives compiler error with older c library 【发布时间】:2010-02-19 13:57:32 【问题描述】:

当我从带有 glibc-2.5-25 (suse 10.2) 的计算机移植到带有 glibc-2.3.2-6 (suse 8.2) 的计算机时,我的代码出现了一个奇怪的问题。我对临时对象使用了几个方法调用,但它们在旧机器上不起作用。

class A

public:
    A(int n) 
    void method() 
;

int main()

    A(10).method(); //here the compiler gives parse error before . 

    A a(10);
    a.method(); //this works fine 

这真的会因为旧的 libc 版本而发生吗?或者它可能是我的 IDE 中的一个设置(编译器设置)?

【问题讨论】:

glibc 是一个库 - 这是一个编译问题。 你使用的是什么编译器版本? 是的,你是对的,gcc版本如下:新平台上的gcc-4.1.3-29旧平台上的gcc-3.3-23(有问题) 【参考方案1】:

为什么 libc 版本会影响解析错误? g++ 版本会更有用。

gcc 在 3.4 版左右更改了它的解析器,并在当时解决了许多在旧的 yacc 解析器中不容易修复的解析问题。这可以解释你所看到的。

【讨论】:

【参考方案2】:

这似乎是一个编译器错误:http://gcc.gnu.org/ml/gcc-bugs/1998-10/msg00178.html(旧版本,相同错误)。具有相同语义的解决方法如下:

#define TEMP(T, x, y)  T _temporary(x); _temporary.y; 

A(10).method(); // is:
TEMP(A, 10, method())

呸。

【讨论】:

以上是关于调用临时对象的方法会导致旧 c 库的编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用它们时,同一调用中的两个泛型方法是不是会导致编译错误?

为啥 c = ++(a+b) 会出现编译错误?

C程序为啥会崩溃?

为啥在 BinaryReader 上调用 Dispose() 会导致编译错误?

为啥这个方法调用不明确?

c++,类的对象作为形参时一定会调用复制构造函数吗?