From: ses on 14 Apr 2010 03:21 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 14 Apr 2010 08:37 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 14 Apr 2010 08:40 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 14 Apr 2010 15:54 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 14 Apr 2010 15:52 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! ]
|
Next
|
Last
Pages: 1 2 Prev: type of a lambda expression Next: CoW and reference counting in the STL |