700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 没那么简单 没那么困难

没那么简单 没那么困难

时间:2019-07-21 17:05:07

相关推荐

没那么简单 没那么困难

前就总是口头上挂着说要去弄linux下的gcc编译,不幸这接触的项目都跟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;// errorcout << "Hello world!" << endl;return 0;}

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

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

template<typename T>classTTypeToTypeDecl{public:typedefNullTypetype;staticTypeBase*getTypeDecl(){static_assert(false, "wrong type declaration!");return NULL;}};

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

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

好在这玩意儿比较好绕:

template<typename T>classTTypeToTypeDecl{public:typedefNullTypetype;staticTypeBase*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库整合进去了。

继续各种折腾吧……

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。