gnucobol-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [open-cobol-list] Calling C++ from GNU COBOL


From: Scott McKellar
Subject: Re: [open-cobol-list] Calling C++ from GNU COBOL
Date: Tue, 11 Nov 2014 08:09:31 -0800

Responding to my own post...

Simon Sobisch and Patrick both suggested that I write a small wrapper in C++ 
that would call the real program in COBOL and not do much else.  I had 
considered that briefly, but I had hoped to avoid that approach.  It would 
entail a sizable disruption to our existing code base and development practices.

Also, Brian mused about possibly adding explicit support in GNU COBOL for 
calling C++ routines.

Finally I got around to what I should have done in the first place, namely some 
experimentation.

I got my Hello World program (in COBOL) to link to a little C++ routine that 
wrote a message to standard output using std::cout (I had to add the -lstdc++ 
option to the compile line).  Rather to my surprise, it worked.

Thinking there might be something special going on with std::cout, I concocted 
a little class whose constructor stores a time stamp for the current date and 
time.  Then I declared a static instance of that class and referenced it from 
my little C++ routine.  That worked too.  The static instance got initialized 
somehow, even though the top-level program was in COBOL.

I also tried calling the same routine from C, with GNU COBOL taken out of the 
picture.  It still worked.

Conclusion: at least in my environment (gcc and g++ on RedHat Linux), C knows 
how to initialize static objects defined in C++.

For my purposes, I think that's good enough, provided that I'm willing to 
sacrifice some portability.

However I wouldn't generalize this finding to other environments.  I have read 
warnings about calling C++ from other languages, but the danger is highly 
system-specific.

----------

In the more general case, one might find oneself on a system where the C 
compiler isn't smart enough to initialize C++ standard objects.  In that case, 
maybe the following approach would work:

If GNU COBOL is compiling a module that includes a main(), it could contrive to 
compile it as C++, instead of C, provided that a C++ compiler were available.  
Then the top-level module would be in C++ and it would know how to initialize 
static objects.

This approach assumes that the C code generated by GNU COBOL is compilable as 
C++, or could be made compatible with a minimum of fuss.  The main issue would 
be to make sure that suitable function prototypes were in scope.  I don't know 
how much of a big deal that would be.




----------

Thanks to all who responded.

Scott McKellar

________________________________

> Is it possible to call C++ routines (declared of course as extern "C") 

> from GNU COBOL?  Do we need to use the version that emits C++, or can we > 
> use the version that emits C?
>
> Context: I'm trying to evaluate a possible migration to GNU COBOL from 

> an expensive proprietary COBOL compiler (currently running Linux, RedHat > 
> 4.1.2).  Many of our existing COBOL programs rely on C++ routines for 

> various things, especially for parsing XML.  I really don't want to have > to 
> rewrite all that stuff in some other language.
>
> What concerns me most is the initialization of static objects.  For 

> example, std::cout is a statically allocated instance of an ostream.  It > 
> needs to be initialized before use (to connect it to standard output).
>
> If the main program is in C++, the C++ compiler can give it special 

> treatment to ensure that static objects are initialized before control 

> enters main().  If the main program is in some other language, we still > 
> need the same kind of magic, or else static objects won't get 
> initialized.
>
> Our current compiler provides this magic if you feed it the right 

> compile option.  I don't see a similar option for GNU COBOL.
>
> So far I've been playing with GNU COBOL 1.1, compiled from source.  I 

> tried a Hello World program that called a little C++ program, but it 

> didn't get past the link because it couldn't find the library for 

> std::cout.  I can probably find a way to make the link work, but if I 

> do, I suspect that std::cout won't work.
>
> I understand that there is a GNU COBOL CPP from Sergey that emits C++ 

> instead of C.  In that case we could presumably call C++ routines as we > do 
> today and any static objects would be healthy.
>
> However I get the impression that the CPP version is a recent 

> development and may still be bleeding-edge.  Ours is a big corporate 

> shop; bleeding edges make people nervous.
>
>
>    * Is there a way to call C++ safely from GNU COBOL 1.1, or do we have > to 
> use the CPP version?
>
>    * Is the CPP version considered production-ready?  Is anyone using it > 
> successfully in a large-scale production environment?
>
> Scott McKellar


reply via email to

[Prev in Thread] Current Thread [Next in Thread]