cdecl and c++decl are two nice tools to check syntax or to generate declaration of C and C++ respectively.
for example, using c++decl (the text in bold is the one we type):
$ cdecl
Type `help' or `?' for help
c++decl>
for example, using c++decl (the text in bold is the one we type):
$ cdecl
Type `help' or `?' for help
c++decl>
c++decl> declare foo as pointer to member of class X function (arg1, arg2) returning reference to class Y
class Y &(X::*foo)(arg1, arg2)
c++decl>
c++decl> declare foo as reference to class X
class X &foo
c++decl>
c++decl> cast foo into reference to class X
(class X &)foo
c++decl>
We can also use them to check a declaration syntax, for example:
c++decl> explain int (*a)[5]
declare a as pointer to array 5 of int
c++decl>
c++decl> explain long **foo[10]
declare foo as array 10 of pointer to pointer to long
c++decl>
c++decl> explain int*&(foo);
declare foo as reference to pointer to int
c++decl>
The function can also be used to translate an english declaration to C (or C++) declaration. For example:
$ c++decl declare "i as array 5 of pointer to function(int,int) returning reference to class X"
class X &(*i[5])(int , int )
$
$ c++decl declare "i as array 5 of pointer to function(reference to class X,constant reference to int) returning reference to class X"
class X &(*i[5])(class X &, int & const )
$
$ c++decl declare "const_ptr as const pointer to const int"
const int * const const_ptr
$ c++decl declare "const_ptr as const pointer to const reference to class X"
class X & const * const const_ptr
$
c++decl> declare myfunc as const pointer to function (const pointer to int, reference to class X) returning void
void (* const myfunc)(int * const , class X &)
c++decl>
c++decl> declare myfunctpr as array of pointer to function (void) returning int
int (*myfunctpr[])(void )
c++decl>
declare myptr as pointer to array 10 of struct MyStruct
struct MyStruct (*myptr)[10]
c++decl>