【发布时间】:2013-08-07 09:54:06
【问题描述】:
我是 gcc 新手,在 gcc-4.7.2/4.7.3 中编译预编译头文件时遇到了一个非常奇怪的问题。
以下代码:
FooClass.h
#include <cstddef>
#include <X11/X.h>
#include <xmmintrin.h>
#include <emmintrin.h>
#include <smmintrin.h>
#ifndef FOO_CLASS_ERROR
#define FOO_CLASS_ERROR
class FooClass
{
public:
union
{
struct
{
float x,y,z,w;
};
__m128 v;
};
FooClass( void )
{
}
FooClass( const __m128 _v )
: v( _v )
{
}
FooClass( const FooClass& rhs )
: v( rhs.v )
{
}
FooClass operator -( void ) const;
} __attribute__( (aligned(16)) );
#endif
FooClass.cpp
#include "FooClass.h"
FooClass FooClass::operator -( void ) const
{
return FooClass();
}
编译为pch:
g++ -Wall -fexceptions -g -msse4.1 -Winvalid-pch -include "FooClass.h" -c FooClass.h -o FooClass.h.gch
g++ -Wall -fexceptions -g -msse4.1 -Winvalid-pch -include "FooClass.h" -c FooClass.cpp -o obj/Debug/FooClass.o
会产生错误:
./pch.h:40:17: error: prototype for ‘FooClass FooClass::operator-() const’ does not match any in class ‘FooClass’
./pch.h:36:14: error: candidate is: FooClass FooClass::operator-() const
查了一下午,发现:
删除“const”或复制构造函数将解决这些错误。
但我不知道为什么...有人可以告诉我导致此错误的原因吗?或者可能是 gcc 错误?
【问题讨论】:
-
确保在更改
FooClass.h后重新创建了预编译头。由于实际标头和 PCH 之间的不同步,听起来诊断有一个小错误。即重新构建并让我们知道结果。 -
这不是问题,但是包含两个连续下划线 (
__FooClass__) 的名称和以下划线后跟大写字母的名称保留给实现。不要使用它们。 -
是的,我确实做了一个干净的构建。对于糟糕的代码风格我很抱歉,但我只是在尝试制作可以重现此问题的最少代码,所以请忽略代码风格:-)
-
虽然与您的错误无关,但您应该非常非常小心您使用的“成语”,即包含
__m128的联合。如果您需要访问__m128的组件,您应该进行显式加载和存储,因为这样做可能无法保证正确性。欲了解更多信息,stackoverflow.com/questions/9241721/… -
我只是在本地逐字尝试了您的示例,在 G++ 4.4.4 和 4.8.0 中没有错误。然而,它在 G++ 4.6.0 中失败了。我怀疑它是实际上是一个 G++ 问题。
标签: c++ gcc constants copy-constructor pch