What is the difference/relationship between extern and __declspec(dllimport)? I found that sometimes it is necessary to use both of them, sometimes one is enough.
Am I right that:
externis for statically linked libraries,__declspec(dllimport)is for DLL (dynamically linked libraries),- both do actually the same job for their respective type of linking,
- you need to use both when you use import libraries (small .lib files that help linking with dll)?
externmeans that the entity has external linkage, i.e. is visible outside its translation unit (C or CPP file). The implication of this is that a corresponding symbol will be placed in the object file, and it will hence also be visible if this object file is made part of a static library. However,externdoes not by itself imply that the symbol will also be visible once the object file is made part of a DLL.__declspec(dllexport)means that the symbol should be exported from a DLL (if it is indeed made part of a DLL). It is used when compiling the code that goes into the DLL.__declspec(dllimport)means that the symbol will be imported from a DLL. It is used when compiling the code that uses the DLL.Because the same header file is usually used both when compiling the DLL itself as well as the client code that will use the DLL, it is customary to define a macro that resolves to
__declspec(dllexport)when compiling the DLL and__declspec(dllimport)when compiling its client, like so:To answer your specific questions:
externalone is sufficient for static libraries.extern(see explanation here).externwith a__declspec(dllimport)(see explanation linked to above), but since you’ll usually be using the same header file, you’ll already have theexternin there because it’s needed when compiling the DLL.