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);

}

  

你可能感兴趣的:(programming)