-1

Consider this in a cpp file:

struct someStruct{
    public:
    extern "C"  __declspec(dllexport) int sumup();
} someStruct;

extern "C" __declspec(dllexport) int someStruct::sumup()
{
    return 0;
}

This does not compile: error: expected unqualified-id before string constant Is it no possible to export a C++ member method with C linkage?

Juergen
  • 3,489
  • 6
  • 35
  • 59
  • 3
    How do you suppose that would work, calling a member function in C code? – Wintermute Dec 12 '14 at 10:20
  • It *is* possible, just not very pretty, as you'd have to use the decorated name (haven't done it in 15 years though). C++ programmers always had to provide callback functions to C libraries, including ... the Win32 API. Most likely there is a duplicate answer out there – Panagiotis Kanavos Dec 12 '14 at 10:25
  • 2
    " C++ programmers always had to provide callback functions to C libraries, including ... the Win32 API" - Not sure what that's got to do with it since member functions can't be used as callbacks. – Edward Strange Dec 12 '14 at 10:28

2 Answers2

3

First off, linkage specifications don't apply to member functions; by [dcl.link]/4:

[...] A linkage-specification shall occur only in namespace scope (3.3). [...]

But there's even an example in the Standard that relates to your question somewhat, in the same paragraph:

[...] A C language linkage is ignored in determining the language linkage of the names of class members and the function type of class member functions. [Example:

extern "C" typedef void FUNC_c();
class C {
  void mf1(FUNC_c*);      // the name of the function mf1 and the member
                          // function’s type have C ++ language linkage; the
                          // parameter has type pointer to C function
  FUNC_c mf2;             // the name of the function mf2 and the member
                          // function’s type have C ++ language linkage
  static FUNC_c* q;       // the name of the data member q has C ++ language
                          // linkage and the data member’s type is pointer to
                          // C function
};

extern "C" {
  class X {
    void mf();            // the name of the function mf and the member
                          // function’s type have C ++ language linkage
    void mf2(void(*)());  // the name of the function mf2 has C ++ language
                          // linkage; the parameter has type pointer to
                          // C function
  }
};

end example]

Kerrek SB
  • 464,522
  • 92
  • 875
  • 1,084
0

No. It doesn't work that way. It doesn't work at all. Can't do it. No way no how.

Edward Strange
  • 40,307
  • 7
  • 73
  • 125