Article View: gnu.g++.help
Article #482Combination of C and C++
From: Don Dewar
Date: Thu, 21 Feb 1991 14:35
Date: Thu, 21 Feb 1991 14:35
163 lines
5575 bytes
5575 bytes
) Resent-From: uunet!ai.mit.edu!gnulists
) Return-Path: <gnulists@ai.mit.edu>
) Resent-Date: 12 Feb 91 15:10:07 GMT
) Date: 12 Feb 91 15:10:07 GMT
) From: uunet!.uni-paderborn.de!eggberd (Bernd Eggert)
) Sender: uunet!ai.mit.edu!gnulists
) Organization: Uni-GH Paderborn, West Germany
) Subject: Combination of C and C++
) To: help-g++@prep.ai.mit.edu
)
)
) This message is posted for someone who cannot post to the net himself.
)
) Please respond to the net or to axel@cadlab.cadlab.de !
)
) -------------------------------------------------------------
) I have a question concerning the combination of C and C++.
)
)
) Assume the following situation:
)
) You want to write a library in C++. People working with your library should be
) able to use it either from C++ or from C.
)
) In order to make functions callable from C you use the 'extern "C"' directive.
) With this directive you can write ordinary C functions 'around' the C++
) objects. These functions can be called from a C program.
)
) The problem occurs when you try to link the C program with the C++ library.
) The normal linker does not care for constructors or destructors and therefore
) static objects will not be initialized.
)
) Is there an elegant and portable way to solve this problem? We are interested
) in solutions for AT&T CC and g++.
)
) Below is an example which works if you use the C++-linker (but not with
) a normal linker)
)
) Thanks for any help.
)
) -------------------------------------------------------------------------------
) File 'hello.C':
) -------------------------------------------------------------------------------
)
) /* this is a C++ class to be used by a C program */
)
) #include <stream.h>
) #include <string.h>
) #include <stdio.h>
)
)
) class hello
) {
) private:
) char name[20];
)
) public:
) hello(char *n)
) {
) strcpy(name,n);
) }
)
) void print()
) {
) cout << "Hello " << name << "\n"; /* cout requires initialization */
) printf("Hello %s\n",name); /* printf is no problem */
) }
) };
)
)
) /* these functions enable the non-C++-user to use the class 'hello': */
)
) extern "C"
) {
)
) void *create_person(char *n)
) {
) return((void *)new hello(n));
) }
)
) void print_person(void *p)
) {
) ((hello *)p)->print();
) }
)
) }
)
) -------------------------------------------------------------------------------
) File 'chello.c'
) -------------------------------------------------------------------------------
)
) /* this is a C program dealing with a C++ object */
)
)
) void *create_person(char *n);
) void print_person(void *p);
)
)
) main()
) {
) void *p;
)
) __main(); /* this is necessary for initializing static objects in g++ */
)
) p = create_person("Henry");
)
) print_person(p);
) }
)
) -------------------------------------------------------------------------------
) File 'makefile':
) -------------------------------------------------------------------------------
)
) chello: chello.o hello.o
) g++ -o chello chello.o hello.o
)
) chello.o: chello.c
) gcc -c chello.c
)
) hello.o: hello.C
) g++ -c hello.C
)
)
) -------------------------------------------------------------------------------
) Axel Meckenstock CADLAB
) University of Paderborn
) phone : +49 5251 284-120 Siemens Nixdorf Information Systems
) fax : +49 5251 284-140 Bahnhofstr. 32
) email : axel@cadlab.cadlab.de D-4790 Paderborn
) -------------------------------------------------------------------------------
)
)
)
)
In the case of g++, you must use the g++ linker. I don't find that
particularly unportable, just a little inconvenient for those persons
that want to link with you library and don't have the linker. In the
case of CFront, I don't think you have a problem. CFront just creates
"C" code that is compiled and should act just like a normal "C"
program with name mangling.
I would point out, however, that distributing C++ binary libraries can
be a problem in general for a couple of reasons. If the user wants to
add to the library, they may want to add a new virtual function at a
root class, which throws off the virtual tables. The user must use
the C++ compiler used to generate the libraries if they are linking in
more C++ code that calls the library, because the name mangling scheme
between the two compilers is likely to be different.
I just thought I might pass that on to you. Good luck!
+---------+
| Coral |
|@@@@@*@**|
|@@*@@**@@| Don Dewar
|*@@**@@@@| Coral Network Corporation, Marlborough, MA
|@***@@@@@| Internet: don@coral.com
|@@**@@@@@| Phone: (508) 460-6010
|*********| Fax: (508) 481-6258
|Networks |
+---------+
Technical Details
Message-ID:
<9102211435.AA29323@zardoz.coral.com>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!watserv1!watmath!uunet!tut.cis.ohio-state.edu!unreplyable!garbageReferences:
<1991Feb12.151007.29831@uni-paderborn.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!watserv1!watmath!uunet!tut.cis.ohio-state.edu!unreplyable!garbage From: don@zardoz.coral.com (Don Dewar) Newsgroups: gnu.g++.help,comp.lang.c++ Subject: Combination of C and C++ Message-ID: <9102211435.AA29323@zardoz.coral.com> Date: 21 Feb 91 14:35:05 GMT References: <1991Feb12.151007.29831@uni-paderborn.de> Sender: daemon@tut.cis.ohio-state.edu Followup-To: gnu.g++.help Organization: Gatewayed from the GNU Project mailing list help-g++@prep.ai.mit.edu Lines: 163