Search code examples
c++cdllexportlinkage

Is it possible to export a C++ member method with C linkage in a DLL?


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?


Solution

  • 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]