Cdecl – Turns English phrases into C declarations
1–10 of 56 posts
Re: Cdecl – Turns English phrases into C declarations
#2Re: Cdecl – Turns English phrases into C declarations
#3So one way to read C "gibberish" is to ignore the type at the beginning and parse the rest as an expression like a normal parse tree. First we take foo. Then we dereference it (so foo is a pointer). Next we call it as a function with no arguments (so foo is a pointer to a function that takes no arguments). Next, we dereference it again. Then we index into the result as an array. Finally, we reach the end, so we look at what the declared type and find that this type is an int. So foo is a pointer to a function that takes no arguments and returns a pointer to an array of 3 ints.
You can also use this to go backwards. What's the syntax for a function that takes an integer argument returns a pointer to an array of function pointers taking no arguments and returning integers? Well, we want to take foo, call it, dereference it, then index into an array, then dereference it again, then call it again, then return an int. Or int (* (* (foo)(int))[5])(void).
Re: Cdecl – Turns English phrases into C declarations
#4Re: Cdecl – Turns English phrases into C declarations
#5Re: Cdecl – Turns English phrases into C declarations
#6((void(*)(void))0)();
Re: Cdecl – Turns English phrases into C declarations
#7Need this for bash and by proxy regex.
Re: Cdecl – Turns English phrases into C declarations
#8Tried it on this gibberish but it complains about syntax: ((void(*)(void))0)();
Re: Cdecl – Turns English phrases into C declarations
#9Here's an easy way to understand how these things work: in C, the type of a pointer/function/array mess is declared by how it's used. For a declaration like "int ( * ( * foo)(void))[3]", you can read it as "for a variable foo, after computing the expression ( * ( * foo)(void))[3], the result is an int." So one way to read C "gibberish" is to ignore the type at the beginning and parse the rest as an expression like a…
Great explanation though, it really helps to read things inside-out
Re: Cdecl – Turns English phrases into C declarations
#10Here's an easy way to understand how these things work: in C, the type of a pointer/function/array mess is declared by how it's used. For a declaration like "int ( * ( * foo)(void))[3]", you can read it as "for a variable foo, after computing the expression ( * ( * foo)(void))[3], the result is an int." So one way to read C "gibberish" is to ignore the type at the beginning and parse the rest as an expression like a…
*An array of 4 ints Great explanation though, it really helps to read things inside-out
The declaration "int bar[3];" is an array of 3 ints, which are bar[0], bar[1] and bar[2]. Declaration mimics use but it's not exactly the same; in this case the size replaces the indices, which are all less than it.