Reputation: 157
Like the title says, I want to know what "(int (*)())" in a C-define-function-call means?
As example, it looks similar to this:
#define Bla(x) (Char *) read((char *(*)()) Blub, (char **) x)
or this
#define XXX(nx, id) PEM_ASN1_write_bio((int (*)()) id, (char *) nx)
Thank you in advance!
Upvotes: 3
Views: 3051
Reputation: 113
First one says that read takes "a function pointer that returns a char pointer" as first argument and "pointer to a char pointer" as second argument. If you want to do Bla, just write Bla(x), I ll handle de read part!
Second one says that, first parameter to PEM_ASN1_write_bio must be "a function pointer returning an int". And the second argument is "a pointer to a char". And you can use XXX(a,b) instead of PEM_ASN1_write_bio(b,a), thats all
Upvotes: 0
Reputation: 34592
The easiest way of deciphering complex C expressions is to start with the innermost expression, then in an anti-clockwise pattern move on to the next. (int (*)())
A pointer to a function returning int, since it is wrapped in the outer () is because of the macro.
Hope this helps, Best regards, Tom
Upvotes: 3
Reputation: 1208
(int (*)())
is a typecast operator, which is to say you ask the compiler to behave
as if the expression on its right were of type int (*)()
. As others have indicated,
the type in question means "a pointer to a function accepting any arguments,
and returning an int
".
To understand the type itself, you first need to understand the weird way in which variables are declared in C: in most languages, the syntax for variable declarations is constructed from the syntax for type specifications, but in C, in a way, it's the other way around.
If you were to declare a variable containing a pointer to such a function, you would write:
int (*fp)();
meaning that an expression resembling (*fp)()
would be of type int
: "take fp
,
dereference it, call that with any arguments and you will get an int
".
Now, in order to obtain a typecast operator for the type of fp
in the above declaration, lose the identifier and add parentheses around: you get (int (*)())
.
Upvotes: 1
Reputation: 72798
It means that the first argument of read
, named Blub
is a pointer to a function that returns a char *
and receives no arguments.
Upvotes: 0
Reputation: 399813
The casts the argument to a pointer to a function that returns char *
and takes zero or more arguments. The second function returns int
.
You can use a program (and website, now) called "cdecl" to help with these, it says:
(char *(*)())
: cast unknown_name into pointer to function returning pointer to char(int (*)())
: cast unknown_name into pointer to function returning intUpvotes: 9