I get "error: exception specifications are not allowed beyond a single level of indirection" with the following code. Please point me to the part of standard that says that it is not allowed. I want to be sure that it is really required by the language or just compiler specific error. If it is from language specification, what motivates this rule? I am using clang 3.8.0.
int main()
{
void (**fp)() throw() ;
}
A pointer to a function points to the address of the executable code of the function. You can use pointers to call functions and to pass functions as arguments to other functions. You cannot perform pointer arithmetic on pointers to functions.
1) Unlike normal pointers, a function pointer points to code, not data. Typically a function pointer stores the start of executable code. 2) Unlike normal pointers, we do not allocate de-allocate memory using function pointers. 3) A function's name can also be used to get functions' address.
They are potentially dangerous if misused since program execution can go to unwanted location. In fact, coding standards like MISRA C (e.g. rule 104) forbid the use of variable function pointers. If you are using function pointers, it can be tricky to figure out where they are pointing to.
Function pointers in C can be used to create function calls to which they point. This allows programmers to pass them to functions as arguments. Such functions passed as an argument to other functions are also called callback functions.
You said:
Please point me to a reference book /spec that says that it is not allowed. I want to be sure that it is really required by the language or just compiler specific error.
With
void (**fp)() throw() ;
you are trying to specify an exception-specification in the declaration of a pointer to a function pointer. That is not allowed by the standard. Exception-specification is allowed only for a limited set of declarations.
From https://timsong-cpp.github.io/cppwp/n3337/except.spec#2 (emphasis mine):
An exception-specification shall appear only on a function declarator for a function type, pointer to function type, reference to function type, or pointer to member function type that is the top-level type of a declaration or definition, or on such a type appearing as a parameter or return type in a function declarator. An exception-specification shall not appear in a
typedef
declaration or alias-declaration. [ Example:void f() throw(int); // OK void (*fp)() throw (int); // OK void g(void pfa() throw(int)); // OK typedef int (*pf)() throw(int); // ill-formed
— end example ] A type denoted in an exception-specification shall not denote an incomplete type. A type denoted in an exception-specification shall not denote a pointer or reference to an incomplete type, other than
void*
,const void*
,volatile void*
, orconst volatile void*
. A type cvT
, “array ofT
”, or “function returningT
” denoted in an exception-specification is adjusted to typeT
, “pointer toT
”, or “pointer to function returningT
”, respectively.
You asked:
If it is from language specification, what motivates this rule?
I don't have an answer to that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With