Add macro M_CONST_CAST
This commit is contained in:
1 parent
edb7ad2796
commit
eaa8277f10
2 files changed
+23
No files matched your search
@@ -593,6 +593,17 @@
|
|||||||
# define M_ASSIGN_CAST(type, n) static_cast<type>(n)
|
# define M_ASSIGN_CAST(type, n) static_cast<type>(n)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Cast 'n' of type 'type*' into 'const type*'.
|
||||||
|
This is like (const type*)p but safer as the type of 'n' is checked,
|
||||||
|
and more robust for double arrays type.
|
||||||
|
*/
|
||||||
|
#ifndef __cplusplus
|
||||||
|
# define M_CONST_CAST(type, n) \
|
||||||
|
(((union { type *ptr; const type *cptr; }){n}).cptr)
|
||||||
|
#else
|
||||||
|
# define M_CONST_CAST(type, n) const_cast<const type*>(n)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* From a pointer to a 'field_type' 'field' of a 'type'structure,
|
* From a pointer to a 'field_type' 'field' of a 'type'structure,
|
||||||
* return pointer to the structure.
|
* return pointer to the structure.
|
||||||
|
|||||||
@@ -208,6 +208,17 @@ static void test_oplist(void)
|
|||||||
assert (!CHECK_OPLIST (CLEAR_TOOT, M_DEFAULT_OPLIST));
|
assert (!CHECK_OPLIST (CLEAR_TOOT, M_DEFAULT_OPLIST));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_cast(void)
|
||||||
|
{
|
||||||
|
float f1 = 1.0;
|
||||||
|
float f2 = M_ASSIGN_CAST(float, f1);
|
||||||
|
int i1 = M_ASSIGN_CAST(int, f2);
|
||||||
|
assert (i1 == 1);
|
||||||
|
int *p1 = &i1;
|
||||||
|
const int *p2 = M_CONST_CAST(int, p1);
|
||||||
|
assert (*p2 == 1);
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
test_cat();
|
test_cat();
|
||||||
@@ -222,5 +233,6 @@ int main(void)
|
|||||||
test_va();
|
test_va();
|
||||||
test_if();
|
test_if();
|
||||||
test_oplist();
|
test_oplist();
|
||||||
|
test_cast();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user