ctor13.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 182 行

C
182
字号
#include "fail.h"

int count;

struct CD {
    unsigned signature;
    CD(unsigned);
    ~CD();
};

CD::CD( unsigned line ) : signature(line)
{
    ++count;
}

CD::~CD()
{
    --count;
    if( count < 0 ) fail(__LINE__);
}

int foo( int x, int y, int z )
{
    return
	x ? (
	    CD(__LINE__),
	    y ? (
		CD(__LINE__),
		z ? (
		    CD(__LINE__),
		    7
		) : (
		    CD(__LINE__),
		    6
		)
	    ) : (
		CD(__LINE__),
		z ? (
		    CD(__LINE__),
		    5
		) : (
		    CD(__LINE__),
		    4
		)
	    )
	) : (
	    CD(__LINE__),
	    y ? (
		CD(__LINE__),
		z ? (
		    CD(__LINE__),
		    3
		) : (
		    CD(__LINE__),
		    2
		)
	    ) : (
		CD(__LINE__),
		z ? (
		    CD(__LINE__),
		    1
		) : (
		    CD(__LINE__),
		    0
		)
	    )
	);
}

void bar()
{
    #define paste(x,y)	x##y
    #define xpaste(x,y)	paste(x,y)
    #define __U	xpaste(__x,__LINE__)
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
    static CD __U(__LINE__);
}

int main()
{
    if( foo(0,0,0) != 0 ) fail(__LINE__);
    if( count != 0 ) fail(__LINE__);
    count = 0;
    if( foo(0,0,1) != 1 ) fail(__LINE__);
    if( count != 0 ) fail(__LINE__);
    count = 0;
    if( foo(0,1,0) != 2 ) fail(__LINE__);
    if( count != 0 ) fail(__LINE__);
    count = 0;
    if( foo(0,1,1) != 3 ) fail(__LINE__);
    if( count != 0 ) fail(__LINE__);
    count = 0;
    if( foo(1,0,0) != 4 ) fail(__LINE__);
    if( count != 0 ) fail(__LINE__);
    count = 0;
    if( foo(1,0,1) != 5 ) fail(__LINE__);
    if( count != 0 ) fail(__LINE__);
    count = 0;
    if( foo(1,1,0) != 6 ) fail(__LINE__);
    if( count != 0 ) fail(__LINE__);
    count = 0;
    if( foo(1,1,1) != 7 ) fail(__LINE__);
    if( count != 0 ) fail(__LINE__);
    count = 0;
    bar();
    if( count != 67 ) fail(__LINE__);
    _PASS;
}

struct __ {
    ~__() {
	if( count != 0 ) fail(__LINE__);
    }
};

__ ___;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?