From: ses on
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>

struct S
{
static void atexitMethod()
{
std::cout << "atexitMethod" << std::endl;
}
};

int main()
{
atexit(S::atexitMethod);
}

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?

Thanks in advance.

--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

From: Pete Becker on
ses wrote:
>
> 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?
>

A static member function is not a C function, despite the fact that some compilers treat it as one. If you want a pointer to a C function you have to write a C function:

extern "C" void at_exit_function()
{
// call static member function here
}

int main()
{
atexit(at_exit_function);
return 0;
]

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of
"The Standard C++ Library Extensions: a Tutorial and Reference"
(www.petebecker.com/tr1book)

[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

From: Daniel Krügler on
On 14 Apr., 20:21, ses <shawn.eion.sm...(a)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! ]

From: Pete Becker on
Pete Becker wrote:
> ses wrote:
>>
>> 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?
>>
>
> A static member function is not a C function, despite the fact that some
> compilers treat it as one. If you want a pointer to a C function you
> have to write a C function:
>
> extern "C" void at_exit_function()
> {
> // call static member function here
> }
>
> int main()
> {
> atexit(at_exit_function);
> return 0;
> ]
>

On the other hand, Daniel Kr�gler has the right answer.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of
"The Standard C++ Library Extensions: a Tutorial and Reference"
(www.petebecker.com/tr1book)


[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

From: red floyd on
On Apr 14, 11:21 am, ses <shawn.eion.sm...(a)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>
>
> struct S
> {
> static void atexitMethod()
> {
> std::cout << "atexitMethod" << std::endl;
> }
>
> };
>
> int main()
> {
> atexit(S::atexitMethod);
>
> }
>
> 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?
>

You can't. It doesn't have C linkage.

You need a free function with C linkage.


--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]