I found some code recently where extern “C” was added in source file also for functions. They were also added in the header files where they were declared.
I was under the assumption that adding ‘extern “C” in header files was sufficient.
Where should extern “C” blocks be added?
UPDATE:
Suppose I am compiling my C code using a CPP compiler and have added extern “C” guards for all the functions in header files (i.e. all my functions have their prototypes in headers), but in source files I have not added the same. Will this cause a problem?
Since you mean
style guards, these declare some functions to be of “C” linkage, rather than “C++” linkage (which typically has a bunch of extra name decoration to support things like overloaded functions).
The purpose, of course, is to allow C++ code to interface with C code, which is usually in a library. If the library’s headers weren’t written with C++ in mind, then they won’t include the
extern "C"guards for C++.A C header written with C++ in mind will include something along the lines of
to make sure C++ programs see the correct linkage. However, not all libraries were written with C++ in mind, so sometimes you have to do
to get the linkage correct. If the header file is provided by someone else then it’s not good practice to change it (because then you can’t update it easily), so it’s better to wrap the header file with your own guard (possibly in your own header file).
extern "C"isn’t (AFAIK) ANSI C, so can’t be included in normal C code without the preprocessor guards.In response to your edit:
If you are using a C++ compiler, and you declare a function as extern “C” in the header file, you do not need to also declare that function as extern “C” in the implementation file. From section 7.5 of the C++ standard (emphasis mine):
I’m not convinced it’s good practice though, since there’s the potential for the linkage specifications to diverge by accident (if, for example, the header file containing the linkage specification isn’t included in the implementing file). I think it’s better to be explicit in the implementation file.