C中 #define 模仿 genericity programming from 《C 和 指针 》

/*
 * brief: genericity programming
 *
 */


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define GENERIC_STACK( STACK_TYPE, SUFFIX, STACK_SIZE )         \
                                                                \
        static  STACK_TYPE      stack##SUFFIX[ STACK_SIZE ];    \
        static  int             top_element##SUFFIX = -1;       \
                                                                \
        int                                                     \
        is_empty##SUFFIX( void )                                \
        {                                                       \
                return top_element##SUFFIX == -1;               \
        }                                                       \
                                                                \
        int                                                     \
        is_full##SUFFIX( void )                                 \
        {                                                       \
                return top_element##SUFFIX == STACK_SIZE - 1;   \
        }                                                       \
                                                                \
        void                                                    \
        push##SUFFIX( STACK_TYPE value )                        \
        {                                                       \
                assert( !is_full##SUFFIX() );                   \
                top_element##SUFFIX += 1;                       \
                stack##SUFFIX[ top_element##SUFFIX ] = value;   \
        }                                                       \
        void                                                    \
        pop##SUFFIX( void )                                     \
        {                                                       \
                assert( !is_empty##SUFFIX() );                  \
                top_element##SUFFIX -= 1;                       \
        }                                                       \
        STACK_TYPE                                              \
        top##SUFFIX( void )                                     \

        {                                                       \
                assert( !is_empty##SUFFIX() );                  \
                return stack##SUFFIX[ top_element##SUFFIX ];    \
        }



GENERIC_STACK( int, _int, 10 )
/* GENERIC_STACK( float, _float, 5 ) */
GENERIC_STACK( int, _int1, 10 )

int
main()
{
        push_int( 5 );
        push_int( 22 );
        push_int( 15 );

        push_int1( 4 );
        push_int1( 23 );
        push_int1( 16 );
        /*push_float( 25.3 );
        push_float( -40.5 );*/


        while ( !is_empty_int() )
        {
                printf( "Popping %d\n", top_int() );
                pop_int();
        }

        while ( !is_empty_int1() )
        {
                printf( "Popping %d\n", top_int1() );
                pop_int1();
        }

        /*
        while ( !is_empty_float() )
        {
                printf( "Popping %f\n", top_float() );
                pop_float();
        }*/

        exit(0);
}

  

posted @ 2011-09-17 15:56  lxgeek  阅读(171)  评论(0编辑  收藏  举报