当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

让我们和编译器一起做游戏吧

    搞挂编译器是一件很有趣的事情,编译死循环的程序便是其中之一。让我们和编译器一起做游戏吧~

    1、Preprocess

    a、Self Include(GCC only)

    一般的编译器都有include嵌套层数的限制,所以你需要在适当的时候停止嵌套。利用GCC提供的__INCLUDE_LEVEL__可以很轻松的实现这一点。时间复杂度是na,n是每层的Self Include次数,a是嵌套层数。

    在其它编译器中可以写出类似的代码,只是没这么简洁

    #if __INCLUDE_LEVEL__<199

    #include __FILE__

    #include __FILE__

    #endif

    b、Macro Expansion Explosion

    顾名思义,就是让Preprocess之后的代码量达到O(2n),比如下例:

 #define F1(x) x,x
#define F2(x) F1(x),F1(x)
#define F3(x) F2(x),F2(x)
#define F4(x) F3(x),F3(x)
#define F5(x) F4(x),F4(x)
#define F6(x) F5(x),F5(x)
#define F7(x) F6(x),F6(x)
#define F8(x) F7(x),F7(x)
#define F9(x) F8(x),F8(x)
#define G1(x) F9(x),F9(x)
#define G2(x) G1(x),G1(x)
#define G3(x) G2(x),G2(x)
#define G4(x) G3(x),G3(x)
#define G5(x) G4(x),G4(x)
#define G6(x) G5(x),G5(x)
#define G7(x) G6(x),G6(x)
#define G8(x) G7(x),G7(x)
#define G9(x) G8(x),G8(x)

int main()
{
G9(1);
}

    当然,不同的编译器对预处理结果溢出的处理也不尽相同,一般上面的代码不会达到预期的目的。GCC会直接出错,而VC会出ICE(Internal Compiler Error)

    2、Template

    a、嵌套

    类似的,模版也有嵌套层数限制,但是也很容易绕过。

    GCC的某些版本就会被下面的代码搞挂(VC不会):

 #include <cstddef>
template <class T>
struct Test {
static const size_t Value=Test<Test<T> >::Value;
};
    不过利用VC的某个bug(或者说特性),可以很容易的写出O(na)编译时间的模版:

 #include <cstddef>

#define INNER(A3,N3,A2,N2) \
template<size_t N3>\
struct A3\
{\
enum {N=A3<N3-1>::N+1};\
};\
template<>\
struct A3<0>\
{\
enum {N=A2<N2-1>::N};\
};

#define OUTER(A2,N2,A1,N1,A3,CONTENT) \
template<size_t N2>\
struct A2\
{\
CONTENT\
\
enum {N=A3<N2>::N};\
};\
template<>\
struct A2<0>\
{\
enum {N=A1<N1-1>::N};\
};

#define LEVEL2(a,b,c) INNER(A##b,N##b,A##a,N##a)
#define LEVEL3(a,b,c) OUTER(A##b,N##b,A##a,N##a,A##c,LEVEL2(a##1,b##1,c##1))
#define LEVEL4(a,b,c) OUTER(A##b,N##b,A##a,N##a,A##c,LEVEL3(a##1,b##1,c##1))
#define LEVEL5(a,b,c) OUTER(A##b,N##b,A##a,N##a,A##c,LEVEL4(a##1,b##1,c##1))

template<size_t N1>
struct A1
{
LEVEL5(1,11,111)
enum {N=A11<N1>::N};
};
template<>
struct A1<0>
{
enum {N=0};
};

int main()
{
Evil<100> evil;
}

 

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接