Re: Static Member Function - Function Pointer
On 14 Apr., 20:21, ses <shawn.eion.sm...@googlemail.com> wrote:
I apologize if this is the wrong forum, since it's specific to VMS.
If anyone can suggest a better forum, I'll be happy to throw the
question across.
Anyways, trying to do a Loki port to VMS and came across a problem
with using static member functions as arguments to C functions,
specifically atexit.
//This is the example I used to figure out what's going on
#include <iostream>
You should include <cstdlib> here.
struct S
{
static void atexitMethod()
{
std::cout << "atexitMethod" << std::endl;
}
};
int main()
{
atexit(S::atexitMethod);
You should use std::atexit here.
}
The gnu compiler deals with this like a champ. The HP compiler on VMS
spits out an error messages that says that the argument to atexit -
(void (*)()) does not match (void (*)() C).
Has anyone come across this and is there a way to get the compiler to
recognize a static member method as a normal C function pointer?
I occasionally stumbled across this as well. Nevertheless
this is due to an incorrect library implementation or
incorrect configuration between library and compiler.
The reason why this must be well-formed is based on the
specification in [lib.support.start.term]/3 (C++03) or
[support.start.term]/4 (C++0x working draft N3090):
extern "C" int atexit(void (*f)(void));
extern "C++" int atexit(void (*f)(void));
The meaning of these declarations is that the std::atexit
overload of the first form shall accept a pointer to
a function of C language linkage and the second form
shall accept pointer to a function of C++ language
linkage. The linkage-specification of S::atexitMethod is
required to be C++ language linkage. A library is not
required to provide both forms, but the effects must
be the same. You may want to test whether the strange
compiler/library compiles the following program
successfully:
extern "C" int foo(void (*)());
extern "C++" int foo(void (*)());
struct S {
static void g();
};
int main () {
foo(S::g);
}
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]