没那么简单,没那么困难

编程入门 行业动态 更新时间:2024-10-27 20:36:04

没那么简单,没那么<a href=https://www.elefans.com/category/jswz/34/1769905.html style=困难"/>

没那么简单,没那么困难

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;     // errorcout << "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库整合进去了。

继续各种折腾吧……

更多推荐

没那么简单,没那么困难

本文发布于:2023-06-24 14:25:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/865680.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:困难   简单

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!