困难"/>
没那么简单,没那么困难
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库整合进去了。
继续各种折腾吧……
更多推荐
没那么简单,没那么困难
发布评论