S
SenderX
I am porting a library from msvc++ to gcc and POSIX and was wondering if the
following was even close to being portable/c-std:
#define MEM_CAST unsigned char*
#define MEM_TO_OBJ( m, o ) ( (void*)( ((MEM_CAST)m) + sizeof( o ) ) )
#define OBJ_TO_MEM( m, o ) ( (void*)( ((MEM_CAST)m) - sizeof( o ) ) )
/* On memory released */
typedef void ( *ftMemHeaderOnReleased )
(
void *pUserState
);
/* Memory header */
typedef struct SMemHeader_
{
unsigned int uiRefs;
ftMemHeaderOnReleased clbkOnReleased;
} SMemHeader, *SPMemHeader;
/* Allocs memory */
void* acMalloc
(
size_t stSz,
ftMemHeaderOnReleased clbkOnReleased
)
{
SPMemHeader pMem;
stSz += sizeof( *pMem );
if ( ! ( pMem = malloc( stSz ) ) )
{
return 0;
}
pMem->iRefs = 1;
pMem->clbkOnReleased = clbkOnReleased;
return MEM_TO_OBJ( pMem, *pMem );
}
/* Releases memory */
void acRelease
(
void *pUserState
)
{
SPMemHeader pMem = OBJ_TO_MEM( pUserState, *pMem );
if ( ! ( --pMem ) )
{
if ( pMem->clbkOnReleased )
{
pMem->clbkOnReleased( pUserState );
}
free( pMem );
}
}
If this is not going to work portably, could it possibly be accomplished?
Thank you!

following was even close to being portable/c-std:
#define MEM_CAST unsigned char*
#define MEM_TO_OBJ( m, o ) ( (void*)( ((MEM_CAST)m) + sizeof( o ) ) )
#define OBJ_TO_MEM( m, o ) ( (void*)( ((MEM_CAST)m) - sizeof( o ) ) )
/* On memory released */
typedef void ( *ftMemHeaderOnReleased )
(
void *pUserState
);
/* Memory header */
typedef struct SMemHeader_
{
unsigned int uiRefs;
ftMemHeaderOnReleased clbkOnReleased;
} SMemHeader, *SPMemHeader;
/* Allocs memory */
void* acMalloc
(
size_t stSz,
ftMemHeaderOnReleased clbkOnReleased
)
{
SPMemHeader pMem;
stSz += sizeof( *pMem );
if ( ! ( pMem = malloc( stSz ) ) )
{
return 0;
}
pMem->iRefs = 1;
pMem->clbkOnReleased = clbkOnReleased;
return MEM_TO_OBJ( pMem, *pMem );
}
/* Releases memory */
void acRelease
(
void *pUserState
)
{
SPMemHeader pMem = OBJ_TO_MEM( pUserState, *pMem );
if ( ! ( --pMem ) )
{
if ( pMem->clbkOnReleased )
{
pMem->clbkOnReleased( pUserState );
}
free( pMem );
}
}
If this is not going to work portably, could it possibly be accomplished?
Thank you!