[vox-tech] Reg lex and flex compatibilty
Mark K. Kim
vox-tech@lists.lugod.org
Fri, 4 Jul 2003 09:40:03 -0700 (PDT)
On Fri, 4 Jul 2003, Muthumeena M wrote:
> can u just tell me what is this extern "C" about and
> what if i use g++ ?
> basically what should i use?
C++ does funky things with function names when it stores them in symbol
table (in *.o files). (It does this because you can have multiple
functions with the same names in C++, but we digress.) So if you combine
a C program and a C++ program, you're gonna have function name mismatches.
To avoid this, people can instruct C++ programs to treat certain portions
of the code to be a C-only code. They do this by using `extern "C"` in
the header files. For example:
/* blah.h */
#ifndef BLAH_H_
#define BLAH_H_
#ifdef __cplusplus /* true if C++ compiler, false for C compiler */
extern "C" {
#endif
void blah();
#ifdef __cplusplus
}
#endif
#endif /* BLAH_H_ */
/* blah.c */
#include <stdio.h>
#include "blah.h"
void blah() {
printf("Blah!\n");
}
If you compile the above program with a C compiler, it'll compile it as a
normal C program. If you compile it with a C++ compiler, however, it'll
see:
extern "C" {
void blah();
}
in the header file, which tells it to not to do anything funky with the
blah() function name. So whether you use a C compiler or a C++ compiler,
you'll have a C-compatible "blah.o" file generated.
Later, if you link "blah.o" with another C-compiled object file, it'll
link clean since they're both C-compatible. If you link "blah.o" with
another C++-compiled object file, it'll link clean also, because during
compile time it notices `extern "C"` in the header file.
The common practice these days is to put `extern "C"` in all header files
intended to be compiled with C programs. It's safer that way.
I hope that helps.
-Mark
--
Mark K. Kim
http://www.cbreak.org/
PGP key available upon request.