没那么简单,没那么困难

10年前就总是口头上挂着说要去弄linux下的gcc编译,不幸这10年接触的项目都跟linux无缘,今天终于有机会折腾一下gcc……

最大的感觉,gcc对语法的检查真是严格!vc各种放过我的地方,gcc真是一个个地得理不饶人。

比如下面的菱形继承,vc就放过我了,gcc死也不放,绕也绕不过去,真气人:

class A
{};
class B : public A
{};
class C : public A
{};

class Foo
 : public A
 , public B
 , public C
{};

 

int main()
{
    Foo* f = new Foo();
    B *ptrb = (B*)(Foo*)f;
    C *ptrc = (C*)(Foo*)f;
    A *ptr = (A*)(Foo*)f;     // error

    cout << "Hello world!" << endl;
    return 0;
}

然后的最大的感觉,就是gcc的template基本上都是会直接展开一下的,不像vc,不用是绝对不会展开的。

我这么写了一个检查reflection的类,如果用户试图在没有reflection时就想用反射信息,会毫不客气编译期报错:

template<typename T>
class	TTypeToTypeDecl
{
public:
	typedef	NullType	type;
	static	TypeBase*	getTypeDecl()
	{
		static_assert(false, "wrong type declaration!");
		return NULL;
	}
};

vc是实例化时才展开这个template,所以使用时出错这里才会报编译错误。

而gcc是直接展开,所以这么写直接就over了,只要包含这个头文件就直接编译错误。

好在这玩意儿比较好绕:

template<typename T>
class	TTypeToTypeDecl
{
public:
	typedef	NullType	type;
	static	TypeBase*	getTypeDecl()
	{
		static_assert(std::is_same<NullType, TTypeToTypeDecl<T>::type>::value, "wrong type declaration!");
		return NULL;
	}
};

此外的还有就是我很多template是按照假设写的,template A假设传入的T一定具有某些方法,严格的gcc毫不客气各种报错……

好在unix系强大的定制性的习惯:果断开一个命令行指令就把Error转成Warning了。

 

吐槽这么多其实还是很感谢GCC的,严格一点其实是件好事,可以导致更少地去犯错误。

这玩意,比预想中的复杂,但好像又没有预想中那么困难。两个小时就把自己的reflection库整合进去了。

继续各种折腾吧……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值